代码随想录算法训练营第十九天| 二叉树 669. 修剪二叉搜索树 108.确定递归函数返回值及其参数

669. 修剪二叉搜索树

修剪二叉树通过设置root将左右结点的值接住,如果不符合,则根据二叉搜索树特点重新搜索

确定递归函数的参数以及返回值:返回值为结点,参数为root,边界

确定终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

确定单层逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

cpp 复制代码
class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root==NULL)return NULL;
        if(root->val<low){
            //注意审题,题目是二叉搜索树,如果结点值比最小值小,则它的右子树有可能会在范围内
            TreeNode* right=trimBST(root->right,low,high);
            return right;
        }
        if(root->val>high){
            TreeNode* left=trimBST(root->left,low,high);
            return left;
        }
        root->left=trimBST(root->left,low,high);
        root->right=trimBST(root->right,low,high);
        return root;
    }
};

108. 将有序数组转换为二叉搜索树

构造二叉树的题目都可以用前序遍历来做,因此需要找到前序遍历的根结点,即中间的位置。本题参看前面构造最大二叉树的方法,采用前序遍历的方法,为了让node不被size为1时不存在,在最开始首先定义node,然后找出中间结点。

确定递归函数返回值及其参数:参数为数组,返回值为结点

确定终止条件:如果数组只剩1个或者没有了,需要返回

确定递归逻辑:首先先找到中间结点,对于双数的数组来说,中间结点可以是左边也可以是右边,这里选择左边的(为了后续正确往右遍历而不会溢出)。然后将左结点接住左边的数组,右结点接住右边的数组即可。

cpp 复制代码
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* node=new TreeNode();
        if(nums.size()==1){
            node->val=nums[0];
            return node;
        }
        if(nums.size()==0)return NULL;
        int mid=(nums.size()-1)/2;
        node->val=nums[mid];
        vector<int> left(nums.begin(),nums.begin()+mid);
        vector<int> right(nums.begin()+mid+1,nums.end());
        node->left=sortedArrayToBST(left);
        node->right=sortedArrayToBST(right);
        return node;
    }
};

538. 把二叉搜索树转换为累加树

本题只需要理解题目就挺容易的,题目的意思为新二叉树上面的结点大小等于原二叉树比它大的所有结点的和。由于原二叉树是一个二叉搜索树,最大的值在最右下角的结点,可以从最大的开始遍历,因此本题的遍历顺序应该为右中左。

确定递归函数参数以及返回值:不需要递归函数的返回值做什么操作了,要遍历整棵树。同时需要定义一个全局变量pre,用来保存cur节点的前一个节点的数值

**确定终止条件:**空结点终止,表示到底了

**确定单层递归逻辑:**中节点的处理逻辑就是让cur的数值加上前一个节点的数值。

cpp 复制代码
class Solution {
public:
    TreeNode* pre=NULL;
    void traversal(TreeNode* cur){
        if(cur==NULL)return ;
        traversal(cur->right);
        if(pre)cur->val+=pre->val;
        pre=cur;
        traversal(cur->left);
    }
    TreeNode* convertBST(TreeNode* root) {
        traversal(root);
        return root;
    }
};
相关推荐
callJJ1 小时前
从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序
java·数据结构·算法·深度优先·图论·广度优先·图搜索算法
脱脱克克2 小时前
2025.4.9 华为机考 第1题-补丁版本升级
python·算法·华为
liuluyang5305 小时前
C语言C11支持的结构体嵌套的用法
c语言·开发语言·算法·编译·c11
勤劳的进取家6 小时前
贪心算法之最小生成树问题
数据结构·python·算法·贪心算法·排序算法·动态规划
牛奶咖啡.8546 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
亓才孓6 小时前
[leetcode]stack的基本操作的回顾
算法
小美爱刷题6 小时前
力扣DAY46-50 | 热100 | 二叉树:展开为链表、pre+inorder构建、路径总和、最近公共祖先、最大路径和
算法·leetcode·链表
Fanxt_Ja7 小时前
【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)
java·数据结构·算法·红黑树
永恒迷星.by7 小时前
全球变暖(蓝桥杯 2018 年第九届省赛)
算法
那就摆吧8 小时前
数据结构-复杂度详解
数据结构