将有序数组转换为二叉搜索树(平衡)

0x01.问题

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

C++结构体:
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 函数形式:    TreeNode* sortedArrayToBST(vector<int>& nums)     
 

0x02.简要分析

问题大致是将一个有序的数组转换成平衡的二叉搜索树。

我们不要看到平衡就开始想着如何去转话平衡了,因为转换平衡确实工作量有点大,我们可以发现,题目还有一个有利条件,就是数组是有序的,有序有什么用呢?

二叉搜索树的中序遍历得到的序列不就是一个有序序列嘛,我们可以将这个中序序列转化为一个平衡的二叉树。该如何转化呢?

我们知道,中序遍历序列的中点一定是二叉树的根,对于奇数个来说,就是中间那个,对于偶数个来说,中间两个都可以作为根,我们可以先找到这个根,然后把这个序列分为左右两个部分,左边是一个有序序列,那么左边的中点就是根的左子树,右边的中点就是根的右子树,这两个子树同样也可以看作下面那些子树的根,所以,我们只要不断地取数列的中点,不断的递归调用,就能完成这个创建平衡搜索二叉树的过程,为什么这样创建的一定是平衡的呢?

因为左边的个数和右边的个数相差绝对不会超过1,如果是偶数个,选择中点后,左右两边相差1,如果是奇数个,选择中点后,左右个是相等的。

注意:

  • 由中序遍历得到的二叉树是不唯一的,所以在选择中点的时候,就可以有多种选择。
  • 这个过程其实是按前序遍历创建的是,但是使用的序列是中序的。
  • 这其实也算是一个二分的过程,在这里终止条件是left>right

0x03.将有序数组转化为平衡的二叉搜索树

class Solution {
public:
    TreeNode* helper(int left,int right,vector<int>& nums){
        if(left>right) return NULL;
        int mid=(left+right)/2;
        TreeNode*root=new TreeNode(nums[mid]);
        root->left=helper(left,mid-1,nums);
        root->right=helper(mid+1,right,nums);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return helper(0,nums.size()-1,nums);
    }
};

ATFWUS --Writing By 2020–03–26

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
将一个升序转换为高度平衡二叉搜索树,可以采用递归的方式来实现。 具体步骤如下: 1. 找到组的中间元素,作为二叉搜索树的根节点。 2. 将组分成左右两个子组,左子组中的元素都小于根节点,右子组中的元素都大于根节点。 3. 递归地处理左右子组,分别将它们转换为左右子树。 4. 将左右子树挂在根节点下,构成一棵完整的二叉搜索树。 以下是代码示例: ```cpp #include <iostream> #include <vector> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: TreeNode* sortedArrayToBST(vector<int>& nums) { return buildBST(nums, 0, nums.size() - 1); } private: TreeNode* buildBST(vector<int>& nums, int left, int right) { if (left > right) { return NULL; } int mid = (left + right) / 2; TreeNode* root = new TreeNode(nums[mid]); root->left = buildBST(nums, left, mid - 1); root->right = buildBST(nums, mid + 1, right); return root; } }; int main() { vector<int> nums = {1, 2, 3, 4, 5, 6, 7}; Solution solution; TreeNode* root = solution.sortedArrayToBST(nums); // 遍历打印二叉树 return 0; } ``` 在这个示例中,我们定义了一个 `Solution` 类,其中包含了一个 `sortedArrayToBST` 函,用于将升序转换为高度平衡二叉搜索树。 我们在 `sortedArrayToBST` 函中调用了 `buildBST` 函,用于递归地构建二叉搜索树。`buildBST` 函的参中,`nums` 表示原始组, `left` 和 `right` 表示当前处理的组区间。 在 `buildBST` 函中,首先判断当前区间是否为空,如果为空则返回 `NULL`。然后计算出当前区间的中间位置 `mid`,将 `nums[mid]` 作为根节点。再递归地处理左右子组,分别将它们转换为左右子树。最后返回根节点,构成一棵完整的二叉搜索树。 最后,我们可以使用遍历的方式打印出生成的二叉搜索树,以验证其正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ATFWUS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值