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);
    }
};

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

相关推荐
是白可可呀10 分钟前
LeetCode 169. 多数元素
leetcode
jz_ddk23 分钟前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
CloudAce云一39 分钟前
谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
算法
轻语呢喃1 小时前
每日LeetCode : 杨辉三角
javascript·后端·算法
YuTaoShao2 小时前
【LeetCode 热题 100】148. 排序链表——(解法二)分治
java·算法·leetcode·链表
Shilong Wang2 小时前
三维旋转沿轴分解
算法·计算机视觉·机器人
ygming2 小时前
Q43- code973- 最接近原点的 K 个点 + Q44- code347- 前 K 个高频元素
前端·算法
lightqjx2 小时前
【数据结构】顺序表(sequential list)
c语言·开发语言·数据结构·算法
ygming2 小时前
Hashmap/ Hashset- Q39~Q42内容
前端·算法
蒟蒻小袁3 小时前
力扣面试150题--全排列
算法·leetcode·面试