1. 来源
T108. 将有序数组转换为二叉搜索树
https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
T109. 有序链表转换二叉搜索树:
https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/
上面两题都是要求转换为二叉搜索树。
比较典型,解法也比较有意思。
2. 要求
一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
这是一个比较重要的要求。
我们根据其特性进行解决。
3. 解法
递归分治解法:
- 如果我们取中点的值进行构造树,那么左子树就是数组的左半部分,右子树就是数组的右半部分。
- 因为是中点的值,所以左右的高度差是不超过1的。
- 并且求左/右子树就是还是这个问题的求解。
- 递归的跳出条件就是只有一个值,那么就是叶子结点,直接返回即可。
4. 代码
4.1 T108
public TreeNode sortedArrayToBST(int[] nums) {
return toBST(nums, 0, nums.length - 1);
}
private TreeNode toBST(int[] nums, int left, int right) {
if(left > right) return null;
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = toBST(nums, left, mid - 1);
root.right = toBST(nums, mid + 1, right);
return root;
}
4.2 T109
public TreeNode sortedListToBST(ListNode head) {
if (head == null) {
return null;
}
if (head.next == null) {
return new TreeNode(head.val);
}
ListNode slow = head;
ListNode fast = head;
ListNode last = null;
while (true) {
if (fast == null) {
break;
}
else if (fast.next == null) {
break;
}
last = slow;
slow = slow.next;
fast = fast.next.next;
}
int num = slow.val;
last.next = null ;
ListNode left = head;
ListNode right = slow.next;
TreeNode leftTree = sortedListToBST(left);
TreeNode rightTree = sortedListToBST(right);
TreeNode now = new TreeNode(num);
now.left = leftTree;
now.right = rightTree;
return now;
}