My Calendar I

  题目大意是实现一个类来管理图书,类的每个实例包含图书的start跟end属性(start<= x < end),确保每个实例的两个属性没有重叠范围。

  很容易想到二叉排序树,将每个实例看成一个结点,有三种情况:

  1.新插入结点的start大于P结点的end,则将新插入结点插入到P结点的右子树,P = P.left。

  2.新插入结点的end小于P结点的start,则将新插入结点插入到P结点的左子树,P = P.right。

  3.新插入结点的范围跟P结点的范围有重叠,则返回false。

  

  给出Java代码:

  

class MyCalendar {
    private MyCalendar left, right;
    private int start, end, tag;
    private MyCalendar root;
    
    public MyCalendar() {
        this.root = null;
    }
    
    public MyCalendar(int start, int end) {
        this.start = start;
        this.end = end;
    }
    
    public boolean book(int start, int end) {
        if(root == null) {
            root = new MyCalendar(start, end);
        } else {
            MyCalendar p = root;
            MyCalendar pre = p;
            tag = 0;
            while(p != null) {
                pre = p;
                if(end <= p.start) {
                    tag = 0;
                    p = p.left;
                } else if(start >= p.end){
                    tag = 1;
                    p = p.right;
                } else {
                    return false;
                }
            }
            
            if(tag == 0) {
                pre.left = new MyCalendar(start, end);
            } else {
                pre.right = new MyCalendar(start,end);
            }
        }
        return true;
    }
}


/**
 * Your MyCalendar object will be instantiated and called as such:
 * MyCalendar obj = new MyCalendar();
 * boolean param_1 = obj.book(start,end);
 */
原文地址:https://www.cnblogs.com/CGJobs/p/7931885.html