题目大意是实现一个类来管理图书,类的每个实例包含图书的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); */