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

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

相关推荐
不去幼儿园几秒前
【启发式算法】Dijkstra算法详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法·图搜索算法
serve the people9 分钟前
神经网络中梯度计算求和公式求导问题
神经网络·算法·机器学习
闻缺陷则喜何志丹15 分钟前
【二分查找、滑动窗口】P10389 [蓝桥杯 2024 省 A] 成绩统计|普及+
c++·算法·蓝桥杯·二分查找·滑动窗口·洛谷·成绩
乔冠宇1 小时前
蓝桥杯算法——铠甲合体
算法·职场和发展·蓝桥杯
商bol451 小时前
算阶,jdk和idea的安装
数据结构·c++·算法
迷迭所归处1 小时前
C语言 —— 愿文明如薪火般灿烂 - 函数递归
c语言·开发语言·算法
冱洇3 小时前
168. Excel 表列名称
leetcode
柠檬鲨_4 小时前
C语言100天练习题【记录本】
c语言·数据结构·算法
float_六七4 小时前
二叉树三种遍历方式——前序、中序、后序(C++)
开发语言·c++·算法