首页 > 试题广场 >

将升序数组转化为平衡二叉搜索树

[编程题]将升序数组转化为平衡二叉搜索树
  • 热度指数:32617 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个升序排序的数组,将其转化为平衡二叉搜索树(BST).

平衡二叉搜索树指树上每个节点 node 都满足左子树中所有节点的的值都小于 node 的值,右子树中所有节点的值都大于 node 的值,并且左右子树的节点数量之差不大于1

数据范围:,数组中每个值满足
进阶:空间复杂度 ,时间复杂度

例如当输入的升序数组为[-1,0,1,2]时,转化后的平衡二叉搜索树(BST)可以为{1,0,2,-1},如下图所示:
或为{0,-1,1,#,#,#,2},如下图所示:
返回任意一种即可。
示例1

输入

[-1,0,1,2]

输出

{1,0,2,-1}
示例2

输入

[]

输出

{}

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    fn new_node(n: i32) -> Option<Box<TreeNode>> {
        Some(Box::new(TreeNode::new(n)))
    }
    fn binary_gen(nums: &Vec<i32>, left: i32, right: i32) -> Option<Box<TreeNode>> {
        if right < left {
            None
        } else {
            let mid = left + (right - left) / 2;
            let mut node = Self::new_node(nums[mid as usize]);
            node.as_mut()?.left = Self::binary_gen(nums, left, mid - 1);
            node.as_mut()?.right = Self::binary_gen(nums, mid + 1, right);
            node
        }
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param nums int整型一维数组 
        * @return TreeNode类
    */
    pub fn sortedArrayToBST(&self, nums: Vec<i32>) -> Option<Box<TreeNode>> {
        // write code here
        Self::binary_gen(&nums, 0, nums.len() as i32 - 1)
    }
}

发表于 2023-09-03 20:04:00 回复(0)

问题信息

难度:
2条回答 21452浏览

热门推荐

通过挑战的用户

查看代码