leetcode刷题. 0402. 1382. 二叉树 medium 基础

0402. 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。

解法:二分思想。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    TreeNode* binaryBuildTree(vector<int> &nums, int lo, int hi)
    {
        if(lo > hi)
            return NULL;

        int mid_ = (lo + hi) / 2;

        TreeNode *node_ = new TreeNode(nums[mid_]);

        node_->left = binaryBuildTree(nums, lo, mid_ - 1);
        node_->right = binaryBuildTree(nums, mid_ + 1, hi);

        return node_;
    }

    TreeNode* sortedArrayToBST(vector<int>& nums) {

        int size_ = nums.size();
        if(size_ <= 0)
            return NULL;

        TreeNode *root_ = binaryBuildTree(nums, 0, size_ - 1);

        return root_;
    }
};

执行结果:

1382将二叉搜索树变平衡 

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。

如果有多种构造方法,请你返回任意一种。

题解提示:利用二叉搜索树的性质,中序遍历输出,然后以中间为root,递归构造树,效率更高,算是本题的最优解这里就可以用到上题的结果了。 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:

    void buildSortedList(TreeNode * root_, vector<TreeNode *> &list_){

        if(nullptr == root_)
            return;

        buildSortedList(root_->left, list_);
        list_.push_back(root_);
        buildSortedList(root_->right, list_);       
    }

    TreeNode* binaryBuildTree(vector<TreeNode *> &nums, int lo, int hi)
    {
        if(lo > hi)
            return NULL;

        int mid_ = (lo + hi) / 2;

        TreeNode *node_ = nums[mid_];

        node_->left = binaryBuildTree(nums, lo, mid_ - 1);
        node_->right = binaryBuildTree(nums, mid_ + 1, hi);

        return node_;
    }    

    TreeNode* balanceBST(TreeNode* root) {

        if(nullptr == root)
            return root;

        vector<TreeNode *> list_;
        buildSortedList(root, list_);

        TreeNode *root_ = binaryBuildTree(list_, 0, list_.size() - 1);
        return root_;  
    }
};

执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值