通过有序数组生成平衡搜索二叉树 & 有序链表转换二叉搜索树(力扣)
通过有序数组生成平衡搜索二叉树
《程序员代码面试指南》第47题 P152 难度:士★☆☆☆
通过数组生成很简单,只需要用有序数组最中间的数生成搜索二叉树的头节点,然后其左边和右边的数分别作为头节点的左子树和右子树即可,然后再往下递归,最终生成整棵二叉树。
public Node generateTree(int[] sortArr) {
if (sortArr == null) {
return null;
}
return generate(sortArr, 0, sortArr.length - 1);
}
public Node generate(int[] sortArr, int start, int end) {
if (start > end) {
return null;
}
int mid = (start + end) / 2;
Node head = new Node(sortArr[mid]);
head.left = generate(sortArr, start, mid - 1);
head.right = generate(sortArr, mid + 1, end);
return head;
}
有序链表转换二叉搜索树
题目:有序链表转换二叉搜索树
力扣第109题 难度:中等
和上题一样,同样是用中间节点作为二叉树的根节点,左右边作为其左右子树。不过链表不好直接用索引很方便的访问,而且单向链表也不好向前遍历。因此思路不完全一样。
官方题解:有序链表转换二叉搜索树——题解
两种方法都是分治法(虽然没学过,不过大概是那个意思)。
方法一通过快慢指针来定位中间节点,时间复杂度:O(nlogn),空间复杂度:
class Solution {
public TreeNode sortedListToBST(ListNode head) {
return buildTree(head, null);
}
public TreeNode buildTree(ListNode left, ListNode right) {
if (left == right) {
return null;
}
ListNode mid = getMedian(left, right);
TreeNode root = new TreeNode(mid.val);
root.left = buildTree(left, mid);
root.right = buildTree(mid.next, right);
return root;
}
public ListNode getMedian(ListNode left, ListNode right) {
ListNode fast = left;
ListNode slow = left;
while (fast != right && fast.next != right) {
fast = fast.next;
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法二为分治+中序遍历优化,将这两者结合起来,时间复杂度:O(n),空间复杂度:
class Solution {
ListNode globalHead;
public TreeNode sortedListToBST(ListNode head) {
globalHead = head;
int length = getLength(head);
return buildTree(0, length - 1);
}
public int getLength(ListNode head) {
int ret = 0;
while (head != null) {
++ret;
head = head.next;
}
return ret;
}
public TreeNode buildTree(int left, int right) {
if (left > right) {
return null;
}
int mid = (left + right + 1) / 2;
TreeNode root = new TreeNode();
root.left = buildTree(left, mid - 1);
root.val = globalHead.val;
globalHead = globalHead.next;
root.right = buildTree(mid + 1, right);
return root;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号