1.题目描述:
给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。高度平衡二叉树是一棵满足每个节点的左右两个子树的高度差的绝对值不超过1的二叉树。
2.递归:
一个升序序列构建BST有多种,即使是以同一个节点为root节点的BST也有多种。结合BST中序遍历的升序特性,可以以升序序列中的任一个元素作为根节点,分割往左构建左子树,分割往右构建右子树即可得到二叉搜索树,本题要求高度平衡,选择升序序列的中间元素作为根节点即可,可以证明这种构建方法得到的必平衡。做法与leetcode654. 最大二叉树、leetcode106. 从中序与后序遍历序列构造二叉树、leetcode105. 从前序与中序遍历序列构造二叉树一样,都属于构建二叉树的题目,105和106难度更大一些。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return helper(nums, 0, nums.length);
}
public TreeNode helper(int[] nums,int left,int right) {
if (left == right) return null;
int index = (left + right) / 2;
TreeNode root = new TreeNode(nums[index]);
root.left = helper(nums, left, index);
root.right = helper(nums, index + 1, right);
return root;
}
}
若没有高度平衡条件,可以使用二叉搜索树的插入操作:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
TreeNode root = new TreeNode(nums[nums.length / 2]);
for (int i = 0; i < nums.length; i++) {
insertIntoBST(root, nums[i]);
}
return root;
}
public TreeNode insertIntoBST(TreeNode root, int val) {
if (root == null) return new TreeNode(val);
if (root.val == val) return null;
if (root.val < val) root.right = insertIntoBST(root.right, val);
else if (root.val > val) root.left = insertIntoBST(root.left, val);
return root;
}
}
3.迭代。。。维护三个队列