树:Postorder

2022-04-19 每日一题 LeetCode

# 0104. 二叉树的最大深度 (opens new window)

题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

解析

二叉树的最大深度为左右子树的最大深度加一得到。

代码

/**
 * 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) return 0;
        return max(maxDepth(root->left), maxDepth(root->right)) + 1;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 0110. 平衡二叉树 (opens new window)

题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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:
    bool isBalanced(TreeNode* root) {
        return check(root) != -1;
    }

    int check(TreeNode* root) {
        if (!root) return 0;

        int l = check(root->left);
        if (l == -1) return -1;

        int r = check(root->right);
        if (r == -1) return -1;

        if (abs(l - r) > 1) return -1;

        return max(l, r) + 1;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 0124. 二叉树中的最大路径和 (opens new window)

题目

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

解析

通过后序遍历递归得到左右子树的最大路径和,依此来更新结果。

代码

/**
 * 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 {
    int ans = INT_MIN;
public:
    int maxPathSum(TreeNode* root) {
        dfs(root);
        return ans;
    }

    int dfs(TreeNode* cur) {
        if (!cur) return 0;

        int left = max(0, dfs(cur->left));
        int right = max(0, dfs(cur->right));

        ans = max(ans, cur->val + left + right);

        return cur->val + max(left, right);
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 0236. 二叉树的最近公共祖先 (opens new window)

题目

解析

代码

# 0250. 统计同值子树 (opens new window)

题目

解析

代码

# 0337. 打家劫舍 III (opens new window)

题目

解析

代码

# 0366. 寻找二叉树的叶子节点 (opens new window)

题目

解析

代码

# 0508. 出现次数最多的子树元素和 (opens new window)

题目

解析

代码

# 0543. 二叉树的直径 (opens new window)

题目

解析

代码

# 0549. 二叉树中最长的连续序列 (opens new window)

题目

解析

代码

# 0563. 二叉树的坡度 (opens new window)

题目

解析

代码

# 0590. N 叉树的后序遍历 (opens new window)

题目

解析

代码

Last Updated: 2023-01-28 4:31:25