[Leetcode] Convert Sorted List to Binary Search Tree
对于Convert Sorted array to Binary Search Tree相对简单,使用二分的方式就可以确定左树和右树的范围。
一、对于此问题,使用二分的方式也是可以的,但是没有数组的随机访问的特性,需要遍历数组找到list的中间node。为了便于查找中间node可以首先统计节点的个数。
剩下的过程变为了
level 1:遍历N/2个节点
level 2:遍历N/4,N/4个绩点
level 3:遍历N/8,N/8,N/8,N/8个节点
所以总的遍历节点个数为:N/2*log(N)
所以复杂度为O(Nlog(N))
上面的方法可以使用递归的方式,递归的深度为log(N)
二、利用中序遍历的思想,以及BST本身具有的终须遍历的单调有序性,可以设计出另外一种方法。
大体思想是:模拟二叉搜索树的终须遍历,使用两个值left和right划定范围,如果left>right,返回null。否则分别遍历[left,mid-1] 和[mid+1,right]
使用中序遍历的特点,在进行完左树遍历之后,在对当前root节点进行初始化,并且将current节点指向下一个节点,在下次初始化时,看到的正好是终须遍历的下一个节点。
1 ListNode current= null; 2 private TreeNode inDFS(int left,int right){ 3 if(right<left) return null; 4 TreeNode lefttree = inDFS(left,(left+right)/2-1); 5 TreeNode root = new TreeNode(current.val); 6 current=current.next; 7 TreeNode righttree = inDFS((left+right)/2+1,right); 8 root.left = lefttree; 9 root.right = righttree; 10 return root; 11 } 12 13 public TreeNode sortedListToBST(ListNode h) { 14 int count=0; 15 ListNode tmp=h; 16 while(tmp!=null){ 17 count++; 18 tmp=tmp.next; 19 } 20 if(h==null) return null; 21 current = h; 22 return inDFS(0,count-1); 23 }