[ 二叉树 ] 有序数组转化为平衡二叉搜索树

本文介绍了如何通过递归方法将有序数组转换为平衡二叉搜索树,利用中点分治策略保持树的平衡性,重点在于理解二叉搜索树的构造和递归调用的过程。

108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)

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

递归

  • 将数组按中点分治递归自然构造成平衡二叉搜索树
  • 平衡来源于中点分治
  • 搜索树来自于有序,利用的是二叉搜索树的性质,和递归体中遍历方式无关
class Solution {
public:
    TreeNode* traversal(vector<int>& nums, int left, int right) {
        // 递归边界
        if (left > right) return nullptr;
        
        // 递归体
        int mid = left + (right - left) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums, left, mid - 1);
        root->right = traversal(nums, mid + 1, right);
        
        return root;
    }

    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return traversal(nums, 0, nums.size() - 1);
    }
};
有序数组转化为二叉搜索树可以使用递归法。根据高度平衡二叉树的性质,数组中间的节点为根节点,数组左边的元素组成左子树,右边的元素组成右子树,一直这样递归,可保证左右子树的高度差始终小于等于 1[^4]。 以下是 Java 实现的代码示例: ```java /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode sortedArrayToBST(int[] nums) { TreeNode root = BST(nums, 0, nums.length); return root; } public TreeNode BST(int[] nums, int left, int right) { //指定数组区间内没有元素 if (right - left < 1) { return null; } //指定数组区间内只有一个元素 if (right - left == 1) { return new TreeNode(nums[left]); } //获取中间的元素,作为根节点 int index = left + (right - left) / 2; TreeNode root = new TreeNode(nums[index]); //递归获取左右子树 root.left = BST(nums, left, index); root.right = BST(nums, index + 1, right); return root; } } ``` 以下是 Python 实现的代码示例: ```python # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: def CT(left, right): if left > right: return None mid = (left + right) // 2 root = TreeNode(nums[mid]) root.left = CT(left, mid - 1) root.right = CT(mid + 1, right) return root return CT(0, len(nums) - 1) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值