Leetcode 第108题 - 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0 / \
-3 9 / / -10 5
解题思路
这道题 我们要注意,给定的是一个有序数组和 高度差 不超过 2,如果 直接采用 普通的平衡二叉树的方式,那么就会变成一个链表,所以 我们采用递归 + 二分法 把 大的放左边 小的放 右边
举个例子 我们把问题规模缩小来思考,如果一个数组 只有 2个数,我们 把 它 除以 2 然后 把左边一个 小的放在左边,右边放大的。
#![allow(unused_variables)] fn main() { impl Solution { pub fn sorted_array_to_bst(nums: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> { if nums.is_empty() { None } else { help(&nums, 0, nums.len()) } } } fn help(nums: &Vec<i32>, start: usize, end: usize) -> Option<Rc<RefCell<TreeNode>>> { if start >= end { None } else { let mid = (start + end) / 2; let node = Rc::new(RefCell::new(TreeNode::new(nums[mid]))); node.borrow_mut().left = help(nums, start, mid); node.borrow_mut().right = help(nums, mid + 1, end); Some(node) } } }