题目如下:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0 / \ -3 9 / / -10 5
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题较为简单,一开始没看明白题意,依旧是看完题解后根据原理实现。
无需纠结唯一解,高度差的绝对值不超过1,即每个节点的左右两个子树的所有子节点数量相差不超过1。
所以,每次输入节点的时,保证当前节点在子数组(包含自身和所有子节点的数组)的中间位置,这样每次输入节点的子节点都是左右平衡。
由于数组长度的奇偶不同,可能在最末端的节点会出现1的高度差,但同样满足题中不超过1的差值。
题解中分别用三种方式选择节点插入位置,原理大同小异,此处只实现节点在中间位置左边的方式。
二叉树基本使用递归实现。
复杂度分析引用力扣题解:
以下为代码:
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode SortedArrayToBST(int[] nums) { return BSTHelper(nums,0,nums.Length - 1); } private TreeNode BSTHelper(int[] nums,int left,int right) { if (left > right) { return null; } int mid =(left + right) / 2; TreeNode root = new TreeNode(nums[mid]); root.left = BSTHelper(nums,left,mid - 1); root.right = BSTHelper(nums,mid + 1,right); return root; } }需要注意一点,由于使用递归,如果不先使用临时的 int 变量存储中间位置的下标,在接下来的三次调用都使用表达式,会使计算时间明显增多。