题目地址:
https://leetcode.com/problems/count-good-nodes-in-binary-tree/
给定一棵二叉树,如果一个节点是从树根到其路径的所有节点的最大值,则称其为“好节点”。求这棵二叉树的好节点个数。
思路是DFS。在DFS的时候将到达当前节点的路径的所有节点的最大值传递到下一层递归里去。代码如下:
public class Solution {
private int res;
public int goodNodes(TreeNode root) {
if (root == null) {
return 0;
}
res = 0;
dfs(root, Integer.MIN_VALUE);
return res;
}
private void dfs(TreeNode cur, int max) {
if (cur == null) {
return;
}
// 如果当前节点是从根到当前节点路径所有节点的最大值,则计入计数
if (cur.val >= max) {
res++;
}
max = Math.max(cur.val, max);
dfs(cur.left, max);
dfs(cur.right, max);
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。
C++:
class Solution {
public:
int goodNodes(TreeNode* root) {
int res = 0;
dfs(root, INT_MIN, res);
return res;
}
void dfs(TreeNode* cur, int maxv, int &res) {
if (!cur) return;
if (cur->val >= maxv) res++;
int x = max(maxv, cur->val);
dfs(cur->left, x, res);
dfs(cur->right, x, res);
}
};
时空复杂度一样。