Tuesday, June 17, 2014

Converted Sorted List to Binary Search Tree -- Leetcode

这个题是二分查找树的题目,要把一个有序链表转换成一棵二分查找树。其实原理还是跟Convert Sorted Array to Binary Search Tree这道题相似,我们需要取中点作为当前函数的根。这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的。这时候就要利用到树的中序遍历了,按照递归中序遍历的顺序对链表结点一个个进行访问,而我们要构造的二分查找树正是按照链表的顺序来的。思路就是先对左子树进行递归,然后将当前结点作为根,迭代到下一个链表结点,最后在递归求出右子树即可。整体过程就是一次中序遍历,时间复杂度是O(n),空间复杂度是栈空间O(logn)加上结果的空间O(n),额外空间是O(logn),总体是O(n)。代码如下: 
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. public TreeNode sortedListToBST(ListNode head) {  
  2.     if(head == null)  
  3.         return null;  
  4.     ListNode cur = head;  
  5.     int count = 0;  
  6.     while(cur!=null)  
  7.     {  
  8.         cur = cur.next;  
  9.         count++;  
  10.     }  
  11.     ArrayList<ListNode> list = new ArrayList<ListNode>();  
  12.     list.add(head);  
  13.     return helper(list,0,count-1);  
  14. }  
  15. private TreeNode helper(ArrayList<ListNode> list, int l, int r)  
  16. {  
  17.     if(l>r)  
  18.         return null;  
  19.     int m = (l+r)/2;  
  20.     TreeNode left = helper(list,l,m-1);  
  21.     TreeNode root = new TreeNode(list.get(0).val);  
  22.     root.left = left;  
  23.     list.set(0,list.get(0).next);  
  24.     root.right = helper(list,m+1,r);  
  25.     return root;  
  26. }  

No comments:

Post a Comment