树: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
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
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
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)
题目
解析
代码