二叉树力扣刷题(18)

87 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

剑指 Offer II 050. 向下的路径节点之和

思路:

代码:

class Solution {
public:
    int rootSum(TreeNode* root, int targetSum) {
        if (!root) {
            return 0;
        }

        int ret = 0;
        if (root->val == targetSum) {
            ret++;
        } 

        ret += rootSum(root->left, targetSum - root->val);
        ret += rootSum(root->right, targetSum - root->val);
        return ret;
    }

    int pathSum(TreeNode* root, int targetSum) {
        if (!root) {
            return 0;
        }
        
        int ret = rootSum(root, targetSum);
        ret += pathSum(root->left, targetSum);
        ret += pathSum(root->right, targetSum);
        return ret;
    }
};

剑指 Offer II 044. 二叉树每层的最大值

思路:

代码:

class Solution {
public:
    vector<int>ret;
    queue<TreeNode*>que;
    vector<int> largestValues(TreeNode* root) {
        if (root == nullptr) return ret;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            int ans = INT_MIN;
            for (int i = 0; i < size; i++) {
                TreeNode*s = que.front();
                que.pop();
                ans = max(ans, s->val);
                if (s->left) {
                    que.push(s->left);
                }
                if (s->right) {
                    que.push(s->right);
                }
            }
            ret.push_back(ans);
        }return ret;
    }
};

515. 在每个树行中找最大值

思路:

代码:

class Solution {
public:
    vector<int>ret;
    queue<TreeNode*>que;
    vector<int> largestValues(TreeNode* root) {
        if (root == nullptr) return ret;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            int ans = INT_MIN;
            for (int i = 0; i < size; i++) {
                TreeNode*s = que.front();
                que.pop();
                ans = max(ans, s->val);
                if (s->left) {
                    que.push(s->left);
                }
                if (s->right) {
                    que.push(s->right);
                }
            }
            ret.push_back(ans);
        }return ret;
    }
};

剑指 Offer II 046. 二叉树的右侧视图

思路:

代码:

class Solution {
public:
    queue<TreeNode*>que;
    vector<int>ret;
    vector<int> rightSideView(TreeNode* root) {
        if (root == nullptr) return ret;
        que.push(root);
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size ; i++) {
                TreeNode* s = que.front();
                que.pop();
                if (i == size - 1) {
                    ret.push_back(s->val);
                }
                if (s->left) {
                    que.push(s->left);
                }
                if (s->right) {
                    que.push(s->right);
                }
            }
        }
        return ret;
    }
};

剑指 Offer II 056. 二叉搜索树中两个节点之和

思路:

代码:

class Solution {
public:
    unordered_set<int> hashtable;
    bool findTarget(TreeNode* root, int k) {
        if (root == nullptr) return false;
        if (hashtable.count(k - root->val)) {
            return true;
        }
        hashtable.insert(root->val);
        return findTarget(root->left, k) || findTarget(root->right, k);
       
        
    }
};

之于如此了,二叉树做了大约20多天吧,每天都在做树,我都快成树了,说实话,我现在肯定还是对一些树的题目不太会,害,止步于此了,做的我都快哭了。