【算法训练 day25 修剪二叉搜索树、将有序数组转化为二叉搜索树、把二叉树搜索转化为累加树】


一、修剪二叉搜索树-LeetCode 669

Leecode链接: leetcode 669
文章链接: 代码随想录
视频链接: B站

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。

示例:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

思路

这道题我跟视频链接的思路稍微有点不一样,我用的是后序遍历。优先判断左右子树的状态,如果左右子树都为空,那么该节点就是叶子节点,根据自身值是否满足区间要求返回空或者本身即可。如果不是叶子节点,那么需要对右子树着重判断,因为如果该节点值不满足[low,high]区间,不代表该节点的右子树值不满足这个区间,如果满足就返回右子树的节点,否则返回空。

实现代码

个人代码

//cpp
class Solution {
public:
    TreeNode* test(TreeNode* root,int low,int high){
        if(root == nullptr)return root;

        
        root->left = test(root->left,low,high);
        root->right = test(root->right,low,high);
        if(root->val<low || root->val>high){//不满足区间条件,根据左右子树情况返回不同值
            if(root->left)return root->left;
            if(root->right)return root->right;
            if(root->right == nullptr) return nullptr;
        }
        
        return root;//满足区间条件返回本身
    }
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        return test(root,low,high);
    }
};

视频链接代码

//cpp
class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr ) return nullptr;
        if (root->val < low) {
            TreeNode* right = trimBST(root->right, low, high); // 寻找符合区间[low, high]的节点
            return right;
        }
        if (root->val > high) {
            TreeNode* left = trimBST(root->left, low, high); // 寻找符合区间[low, high]的节点
            return left;
        }
        root->left = trimBST(root->left, low, high); // root->left接入符合条件的左孩子
        root->right = trimBST(root->right, low, high); // root->right接入符合条件的右孩子
        return root;
    }
};

个人问题

没有明显问题,除了花的时间有点久。


二、将有序数组转化为二叉搜索树-LeetCode 108

Leecode链接: LeetCode 108
文章链接: 代码随想录
视频链接: B站

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵
平衡二叉搜索树。

示例:

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

思路

数组是有序的,每次取数组中间值,然后将数组切割,左区间左子树递归处理,右区间右子树递归处理。

实现代码

//cpp
class Solution {
public:
    TreeNode* build(vector<int>& nums,int left,int right){
        if(left>right){
            return nullptr;
        }

        int mid = (right - left)/2 + left;
        TreeNode* node = new TreeNode(nums[mid]);//取中间值作为父节点

        node->left = build(nums,left,mid - 1);
        node->right = build(nums,mid + 1,right);

        return node;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        
        return build(nums,0,nums.size() - 1);
    }
};

个人问题

简单题,无明显问题。


三.把二叉树搜索转化为累加树-LeeCode 538

Leecode链接: LeetCode 538
文章链接: 代码随想录
视频链接: B站

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

示例:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

思路

题目其实大意应该是使用右中左遍历的顺序来对节点值重新赋值,使用一个全局变量来保存累加和,然后递归处理每个节点即可,理清这个意思题目就基本知道怎么写了。

实现代码

//cpp
class Solution {
public:
    int sum = 0;
    void test(TreeNode* root){
        if(root == nullptr){
            return;
        }

        test(root->right);//右子树
        
        sum = root->val + sum;//更新sum值
        root->val = sum;//重新赋值
        
        test(root->left);//左子树
        
        return;
    }
    TreeNode* convertBST(TreeNode* root) {
        test(root);
        return root;
    }
};

个人问题

简单题,无明显问题。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 13:14:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 13:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 13:14:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 13:14:02       20 阅读

热门阅读

  1. proxySQL 安装与配置

    2024-05-12 13:14:02       11 阅读
  2. Day45 初识HTML

    2024-05-12 13:14:02       11 阅读
  3. 关于python内置inspect

    2024-05-12 13:14:02       14 阅读
  4. iOS 生成SSH Key

    2024-05-12 13:14:02       13 阅读
  5. 记录一个git无法push的问题

    2024-05-12 13:14:02       16 阅读
  6. linux命令

    2024-05-12 13:14:02       12 阅读
  7. 整除C++

    整除C++

    2024-05-12 13:14:02      12 阅读