算法专题[递归-搜索-回溯-2-DFS]

发布时间:2024年01月21日

一.计算布尔二叉树的值:

在这里插入图片描述
计算布尔二叉树的值

1.思路一:

在这里插入图片描述

class Solution {
public:
    bool evaluateTree(TreeNode* root) {
        if(root->left==nullptr && root->right==nullptr)
            return (root->val==1? true:false);

        bool left = evaluateTree(root->left);
        bool right = evaluateTree(root->right);

        return root->val = (root->val==2? (left||right):(left&&right));
    }
};

2.GIF题目解析

在这里插入图片描述

二.求根节点到叶子节点的数字之和

在这里插入图片描述
求根节点到叶子节点的数字之和

1.思路一:

在这里插入图片描述

class Solution {
public:
    int dfs(TreeNode* root , int sum)
    {
        if(root==nullptr)
            return 0;
        sum = (sum*10)+(root->val);
        if(root->left==nullptr && root->right==nullptr)
        {
            return sum;
        }
        int ret = 0 ;
        if(root->left != nullptr) ret += dfs(root->left , sum );
        if(root->right != nullptr) ret += dfs(root->right , sum );
        return ret;
    }
    int sumNumbers(TreeNode* root) {
        return dfs(root , 0);;
    }
};

2.GIF题目解析

在这里插入图片描述

三.二叉树剪枝

在这里插入图片描述

二叉树剪枝

1.思路一:

在这里插入图片描述

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;
            root = nullptr;
        }
        return root;
    }
};

2.GIF题目解析

请添加图片描述

四.验证二叉搜索树

在这里插入图片描述
验证二叉搜索树

1.思路一:

在这里插入图片描述

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root==nullptr)
            return true;
        
        bool left = isValidBST(root->left);
        if(root->val > prev)
            prev = root->val;
        else 
            return false;
        bool right = isValidBST(root->right);
        
        return left&&right;
    }
    long prev = LONG_MIN;
};

在这里插入图片描述

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        if(root==nullptr)
            return true;
        
        bool left = isValidBST(root->left);
        if(left && root->val > prev)
            prev = root->val;
        else 
            return false;
        bool right = isValidBST(root->right);
        
        return left&&right;
    }
    long prev = LONG_MIN;
};

在这里插入图片描述

2.GIF题目解析

五.二叉搜索树中第k小的元素

在这里插入图片描述
二叉搜索树中第k小的元素

1.思路一:

在这里插入图片描述

class Solution {
public:
    void dfs_1(vector<int>& dfs1 , TreeNode* root)
    {
        if(root==nullptr)
            return;
        
        int n = root->val;
        dfs1.push_back(n);
        dfs_1(dfs1 , root->left);
        dfs_1(dfs1 , root->right);
    }
    int kthSmallest(TreeNode* root, int k) {
        //1.遍历:
        vector<int> dfs;
        dfs_1(dfs ,root);
        //2.排序:
        sort(dfs.begin(),dfs.end());
        return dfs[k-1];
    }
};

2.GIF题目解析

六.二叉树的所有路径

在这里插入图片描述
二叉搜索树的所有路径

1.思路一:

1.模拟路径去走判断到叶子节点然后给一个参数去push_back()
2.思路的函数参数是比较好的通过这样的参数可以解决很多问题。
3.特殊情况判断:只有一个节点的判断!

class Solution {
public:
    void dfs(TreeNode* root , string s , vector<string>& ret)
    {
        if(root == nullptr)
            return;

        int n = root->val;
        s += "->";
        s += to_string(n);

        //表示当前是叶子节点
        if(root->left == nullptr && root->right==nullptr)
        {
            ret.push_back(s);
            return;
        }
        dfs(root->left , s , ret);
        dfs(root->right , s , ret);
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        string s = to_string(root->val);
        vector<string> ret;
        if(root->left == nullptr && root->right==nullptr)
        {
            ret.push_back(s);
        }
        else
        {
            dfs(root->left , s , ret);
            dfs(root->right , s , ret);
        }
        return ret;
    }
};

2.GIF题目解析

文章来源:https://blog.csdn.net/2201_75943325/article/details/135592954
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。