DFS总结

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int kthLargest(TreeNode* root, int k) {
        int result = 0;
        dfs(root, result, k);
        return result;
    }

private:
    void dfs(TreeNode *root, int &result, int &k) {
        if (!root) return;
        dfs(root->right, result, k);
        if (!--k) result = root->val;//保留遍历到的第k个节点的值。
        dfs(root->left, result, k);
    }
};
//解题思路总结:
//1.中序遍历的结果为从小到大,所以本题逆着中序遍历进行(右中左)
//2.递归的退出条件为该节点为null
//3.本题的递归是从root节点一右到底,然后再从底部经历根节点(每部分右节点遍历完后),左节点回到顶部,在一左到底,然后再从底部经历根节点(每部分右节点遍历完后),左节点回到顶部。== 右中左的遍历。
//4.其实不仅是本道题目,递归的逻辑恰好一定程度上符合树的遍历逻辑。

在这里插入图片描述

class Solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) {
        if(root == nullptr){
            return false;
        }

        queue<TreeNode*> que_node;
        queue<int> que_val;
        que_node.push(root);
        que_val.push(root->val);

        while(que_node.empty() != true ){
            TreeNode* orb = que_node.front();
            int temp = que_val.front();
            que_node.pop();
            que_val.pop();
            if(orb->left == nullptr && orb->right == nullptr){
                if(temp == targetSum){
                    return true;
                }
            }
            if(orb->left != nullptr){
                que_node.push(orb->left);
                que_val.push(orb->left->val + temp);
            }
            if(orb->right != nullptr){
                que_node.push(orb->right);
                que_val.push(orb->right->val + temp);
            }
            
        }

        return false;
    }
};

总结:
创建两个队列,一个存入节点,一个存入到该节点的大小数值。两个队列同步变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值