dfs bfs

我写了 dfs 的方法,可以说是有点没忘,依照脑海中的写法写的,再记录一下加深一下印象

说到底其实就是这个公式:

左树右树中的最大值+1

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == NULL) return 0;
        int left_depth = maxDepth(root->left);
        int right_depth = maxDepth(root->right);
        return max(left_depth, right_depth) + 1;
    }
};

bfs (层序)

bfs 的关键点就是,层序一个时刻只可能有两层在遍历中

借助这个特性,用两个队列保存节点,上一层空了,就可以开下一层,也就可以 +1 了,试试看

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        int depth = 0;
        queue<TreeNode*> q({root});
        while(!q.empty()) {
            queue<TreeNode*> tmp;
            while(!q.empty()) {
                auto node = q.front();
                q.pop();
                if(node == nullptr) continue;
                tmp.push(node->left);
                tmp.push(node->right);
            }
            q = tmp;
            depth++;
        }
        return depth-1;
    }
};

一次想要清空一层的话,不要按我那个复杂的逻辑,直接内循环清空一层就好了,逻辑清晰