leetcode算法题之递归--二叉树中的深搜总结

递归的本质是找重复的子问题

文章目录

1.计算布尔二叉树的值

计算布尔二叉树的值

cpp 复制代码
class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        if(root->left == nullptr) return root->val == 0?false:true;
        bool left = evaluateTree(root->left);
        bool right = evaluateTree(root->right);
        return root->val == 2? left|right:left&right; 
    }
};

2.从根节点到叶节点数字之和

从根节点到叶节点数字之和

cpp 复制代码
class Solution {
public:
    int sumNumbers(TreeNode* root) {
        return dfs(root,0);
    }
    int dfs(TreeNode* root,int prevsum)
    {
        prevsum = prevsum*10+root->val;
        if(root->left == nullptr && root->right == nullptr) return prevsum;
        int ret = 0;
        if(root->left) ret += dfs(root->left,prevsum);
        if(root->right) ret += dfs(root->right,prevsum);
        return ret;
    }
};

3.二叉树剪枝

二叉树剪枝

cpp 复制代码
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        //后序遍历
        if(root == nullptr) return nullptr;
        root->left = pruneTree(root->left);
        root->right = pruneTree(root->right);
        if(root->left == nullptr && root->right == nullptr && root->val == 0)
        {
            //delete root;//防止内存泄漏,前提是节点是new出来的
            root = nullptr;
        }
        return root;
    }
};

4.验证二叉搜索树

验证二叉搜索树

cpp 复制代码
class Solution {
//性质:二叉搜索树的中序遍历是一个有序的序列
    long prev = LONG_MIN;
public:
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;
        bool left = isValidBST(root->left);
        if(left == false) return false;
        bool cur = false;
        if(root->val>prev)
        {
            cur = true;
        }
        if(cur == false) return false;
        prev = root->val;
        bool right = isValidBST(root->right);
        return left && right && cur;
    }
};

5.二叉搜索树中第K小的元素

二叉搜索树中第K小的元素

cpp 复制代码
class Solution {
//性质:二叉搜索树的中序遍历是一个有序的序列
    int count;
    int ret;
public:
    int kthSmallest(TreeNode* root, int k) {
        count = k;
        dfs(root);
        return ret;
    }
    void dfs(TreeNode* root)
    {
        if(root == nullptr || count == 0) return;
        dfs(root->left);
        count --;
        if(count == 0) ret = root->val;
        dfs(root->right);
    }
};

6.二叉树的所有路径

二叉树的所有路径

cpp 复制代码
class Solution {
    vector<string> ret;
public:
    //递归+回溯
    vector<string> binaryTreePaths(TreeNode* root) {
        string path;
        dfs(root,path);
        return ret;
    }
    void dfs(TreeNode* root,string path)
    {
        path = path+to_string(root->val);
        if(root->left == nullptr && root->right == nullptr)
        {
            ret.push_back(path);
        }
        path += "->";
        if(root->left) dfs(root->left,path);
        if(root->right) dfs(root->right,path);
    }
};

有什么不懂的可以后台直接私信我嗷!

相关推荐
卡卡卡卡罗特1 小时前
每日mysql
数据结构·算法
chao_7892 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
lifallen3 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest3 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
EndingCoder3 小时前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
丶小鱼丶3 小时前
链表算法之【合并两个有序链表】
java·算法·链表
不吃洋葱.3 小时前
前缀和|差分
数据结构·算法
是白可可呀6 小时前
LeetCode 169. 多数元素
leetcode
jz_ddk6 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
CloudAce云一6 小时前
谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
算法