力扣刷题笔记 108. 将有序数组转换为二叉搜索树 C#

    技术2023-07-20  65

    题目如下:

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

    本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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 变量存储中间位置的下标,在接下来的三次调用都使用表达式,会使计算时间明显增多。

    Processed: 0.008, SQL: 9