Convert Sorted List to Binary Search Tree

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

首先想到的是先将单链表转化为数组,就可以取中位数为根节点再递归左右子做,时间复杂度O(n),空间复杂度O(n)。

在网上搜了个时间复杂度为O(n),空间复杂度为O(1)的做法,思路如下:

由于二叉排序树的中序遍历即有序,也就是与本题中的单链表从头到尾遍历相同,所以可以按照类似中序遍历的做法,首先,创建当前节点的左子,然后创建当前节点,将该节点的left指针指向之前创建好的左子,然后创建右子,以这样的顺序,每次新创建的节点都对应单链表的顺序遍历中当前位置的节点,因此,用一个全局遍历表示当链表,在递归过程中不断修改当前单链表的指针,使每次创建的节点与单链表头节点对应。代码如下:

 1 public ListNode head;
 2     public TreeNode sortedListToBST(ListNode head) {
 3         this.head = head;
 4         ListNode p = head;
 5         int len = 0;
 6         while (p != null) {
 7             p = p.next;
 8             len++;
 9         }
10         return buildTree(0, len - 1);
11     }
12 
13     private TreeNode buildTree(int start, int end) {
14         // TODO Auto-generated method stub
15         if (start > end) {
16             return null;
17         }
18         int mid = start + (end - start) / 2;
19         TreeNode left = buildTree(start, mid - 1);
20         TreeNode root = new TreeNode(head.val);
21         root.left = left;
22         head = head.next;
23         root.right = buildTree(mid + 1, end);
24         return root;
25     }

posted @ 2014-06-03 18:54  秋风一片叶  阅读(193)  评论(0编辑  收藏  举报