[LeetCode] #108 将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

[LeetCode] #108 将有序数组转换为二叉搜索树

 

先贴一个二叉搜索树的概念

[LeetCode] #108 将有序数组转换为二叉搜索树

 

 

要实现一棵 高度平衡 二叉搜索树,实际上就是要保证每个节点 是 以此节点为根的子树 的 所有节点 中位数。

那就需要我们不断地缩小区间找中位数,也就是二分法

这里使用递归实现的二分法,原因是 非递归 需要多个栈来保存值

/**
 * 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 - 1);
    }

    public TreeNode helper(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }
        int mid = (left + right) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums, left, mid - 1);
        root.right = helper(nums, mid + 1, right);
        return root;
    }
}

不使用辅助函数

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums.length==0) return null;
        int mid = (nums.length-1)/2; 
        TreeNode root=new TreeNode(nums[mid]);
        root.left=sortedArrayToBST(Arrays.copyOfRange(nums,0,mid));
        root.right=sortedArrayToBST(Arrays.copyOfRange(nums,mid+1,nums.length));
        return root;
    }
}

知识点:

Arrays.copyOfRange(T[ ] original,int from,int to)

  • original:第一个参数为要拷贝的数组对象
  • from:第二个参数为拷贝的开始位置(包含)
  • to:第三个参数为拷贝的结束位置(不包含)

总结:

上一篇:【leetcode】108:将有序数组转化为二叉搜索树


下一篇:Python|2018蓝桥杯真题练习—哪天返回