108.将有序数组转换为二叉搜索树

  1. 108.将有序数组转换为二叉搜索树
    1. 108.1 题目
    2. 108.2 题解
      1. 递归法
    3. 108.3 代码
    4. 108.4 运行结果

108.将有序数组转换为二叉搜索树


108.1 题目

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

示例 1:


输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案。

示例 2:


输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3][3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 按严格递增顺序排列

108.2 题解

递归法

// 方法一:递归法
// 将有序数组转换为高度平衡的二叉搜索树
static TreeNode SortedArrayToBST1(int[] nums)
{
    // 调用递归函数构建二叉搜索树
    return Helper1(nums, 0, nums.Length - 1);
}

// 辅助递归函数
static TreeNode Helper1(int[] nums, int left, int right)
{
    // 当 left 大于 right 时,返回 null
    if (left > right) return null;

    // 选择中间元素作为根节点
    int mid = left + (right - left) / 2;
    TreeNode node = new TreeNode(nums[mid]);

    // 递归构建左子树
    node.left = Helper1(nums, left, mid - 1);

    // 递归构建右子树
    node.right = Helper1(nums, mid + 1, right);

    // 返回当前构建的节点
    return node;
}

108.3 代码

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        #region 题目

        // 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
        // 平衡 二叉搜索树。
        //
        // 示例 1:
        //
        // 输入:nums = [-10,-3,0,5,9]
        // 输出:[0,-3,9,-10,null,5]
        // 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
        //
        // 示例 2:
        //
        // 输入:nums = [1,3]
        // 输出:[3,1]
        // 解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
        //
        // 提示:
        // 1 <= nums.length <= 104
        // -104 <= nums[i] <= 104
        // nums 按 严格递增 顺序排列

        #endregion

        #region 测试

        // 示例 1
        int[] nums1 = { -10, -3, 0, 5, 9 };
        TreeNode result1_1 = SortedArrayToBST1(nums1);
        Console.WriteLine("示例1 方法1 输出:");
        PrintTree(result1_1);



        // 示例 2
        int[] nums2 = { 1, 3 };
        TreeNode result2_1 = SortedArrayToBST1(nums2);
        Console.WriteLine("示例2 方法1 输出:");
        PrintTree(result2_1);


        #endregion
    }

    #region 答案

    // TreeNode 类定义
    public class TreeNode
    {
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int x)
        {
            val = x;
        }
    }

    // 方法一:递归法
    // 将有序数组转换为高度平衡的二叉搜索树
    static TreeNode SortedArrayToBST1(int[] nums)
    {
        // 调用递归函数构建二叉搜索树
        return Helper1(nums, 0, nums.Length - 1);
    }

    // 辅助递归函数
    static TreeNode Helper1(int[] nums, int left, int right)
    {
        // 当 left 大于 right 时,返回 null
        if (left > right) return null;

        // 选择中间元素作为根节点
        int mid = left + (right - left) / 2;
        TreeNode node = new TreeNode(nums[mid]);

        // 递归构建左子树
        node.left = Helper1(nums, left, mid - 1);

        // 递归构建右子树
        node.right = Helper1(nums, mid + 1, right);

        // 返回当前构建的节点
        return node;
    }


    // 打印二叉树(层次遍历)
    static void PrintTree(TreeNode root)
    {
        if (root == null)
        {
            Console.WriteLine("null");
            return;
        }

        Queue<TreeNode> queue = new Queue<TreeNode>();
        queue.Enqueue(root);

        while (queue.Count > 0)
        {
            TreeNode current = queue.Dequeue();
            if (current == null)
            {
                Console.Write("null ");
                continue;
            }

            Console.Write(current.val + " ");
            queue.Enqueue(current.left);
            queue.Enqueue(current.right);
        }

        Console.WriteLine();
    }

    #endregion
}

108.4 运行结果

示例1 方法1 输出:
0 -10 5 null -3 null 9 null null null null 
示例2 方法1 输出:
1 null 3 null null 


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏