Convert Sorted Array to Binary Search Tree
递归解法
思路
数组的中点为根, 然后递归中点为界限的左边和右边的数组. 递归的写法跟常规稍有不同,就是要把根root先new出来,然后它的左节点接到递归左边部分的返回值,右节点接到递归右边部分的返回值,最后将root返回回去。这个模板在树的构造中非常有用.
复杂度
时间: 一次遍历 O(n) 空间栈 O(logn)
代码
public TreeNode sortedArrayToBST(int[] num) {
if (num == null || num.length == 0){
return null;
}
return helper(num, 0, num.length - 1);
}
private TreeNode helper(int[] num, int start, int end){
if (start > end){
return null;
}
int mid = (start + end)/2;
TreeNode node = new TreeNode(num[mid]);
node.left = helper(num, start, mid-1);
node.right = helper(num, mid + 1, end);
return node;
}
Convert Sorted List to Binary Search Tree
递归解法
思路
因为linkedlist与array不同, 无法快速的访问到中间的节点, 而linkedlist的排列顺序正好是树的中序遍历.思路是先将左子树递归, 然后将递归到底的root就是linkedlist的头结点, 然后linkedlist访问下一个节点. 然后递归右子树, 整个过程就是一个中序遍历的过程
复杂度
时间O(n) 空间栈O(logn)
代码
public TreeNode sortedListToBST(ListNode head) {
if (head == null) {
return null;
}
ArrayList<ListNode> res = new ArrayList<ListNode>();
res.add(head);
ListNode cur = head;
int count = 0;
while (cur != null) {
cur = cur.next;
count++;//找出链表的总个数
}
return helper(res, 0, count - 1);
}
public TreeNode helper(ArrayList<ListNode> res, int start, int end) {
if (start > end) {
return null;
}
int mid = (end + start) / 2;
TreeNode left = helper(res, start, mid - 1);
TreeNode root = new TreeNode(res.get(0).val);
root.left = left;
res.set(0, res.get(0).next);//指向链表的下一个元素 因为中序遍历 下一个要访问的点就是该点
root.right = helper(res, mid + 1, end);
return root;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。