F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[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 }

 

posted on 2015-08-15 18:25  F_G  阅读(172)  评论(0编辑  收藏  举报