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

题目如下:

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

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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的差值。

题解中分别用三种方式选择节点插入位置,原理大同小异,此处只实现节点在中间位置左边的方式。

二叉树基本使用递归实现。

复杂度分析引用力扣题解:

力扣刷题笔记 108. 将有序数组转换为二叉搜索树 C#_第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 变量存储中间位置的下标,在接下来的三次调用都使用表达式,会使计算时间明显增多。

你可能感兴趣的:(基础算法)