思路分析
代码实现
java
public int goodNodes(TreeNode root) {
int goodNodesNum = dfs(root, Integer.MIN_VALUE);
return count;
}
int count = 0;
public int dfs(TreeNode root, int pathMaxVal){
// 递归出口
if (root == null) {
return 0;
}
if (root.val >= pathMaxVal) {
count++;
pathMaxVal = root.val;
}
int leftGoodNodes = dfs(root.left, pathMaxVal);
int rightGoodNodes = dfs(root.right, pathMaxVal);
return leftGoodNodes + rightGoodNodes;
}
代码优化
用全局变量 count 统计好节点数,逻辑上是可行的(因为递归过程中会共享这个变量),但全局变量在多线程场景下有线程安全问题,
java
public int goodNodes(TreeNode root) {
int count = dfs2(root, Integer.MIN_VALUE);
return count;
}
public int dfs2(TreeNode root, int pathMaxVal){
// 递归出口
if (root == null) {
return 0;
}
// 判断当前节点是否是号节点
int current = root.val >= pathMaxVal ? 1 : 0;
// 更新最大值
pathMaxVal = Math.max(pathMaxVal, root.val);
int leftGoodsNodes = dfs2(root.left, pathMaxVal);
int rightGoodsNodes = dfs2(root.right, pathMaxVal);
return current + leftGoodsNodes + rightGoodsNodes;
}
复杂度分析
- 时间复杂度:固定为 O (n),因为必须遍历所有节点才能统计好节点,无法优化;
- 空间复杂度:取决于树的高度,最优 O (logn)(平衡树),最坏 O (n)(单链树);