Day94 | 灵神 | 二叉树 统计二叉树中好点的数目

1448.统计二叉树中好点的数目

1448. 统计二叉树中好节点的数目 - 力扣(LeetCode)

思路:

1.递归函数含义

含义就是以t为根结点的子树中有多少个好点

这个一般就和题目要求的东西是一样的

2.参数以及返回值

1
int tra(TreeNode* t,int max)

传入的是根节点以及已经走过的路径的最大值

返回值就是以t为根结点的子树中有多少个好点

3.终止条件

1
2
if(t==nullptr)
return 0;

如果是空节点那肯定不可能有好点了

4.本层逻辑

显然,以t为根结点的好点数量就等于左子树好点数和右子树好点数之和,但是这里还要看当前结点t是否也是好点,是的话那就更新最大值,在左右子树之和基础上再+1,不是的话就不加

1
2
3
4
5
6
if(t->val>=max)
{
max=t->val;
return tra(t->left,max)+tra(t->right,max)+1;
}
return tra(t->left,max)+tra(t->right,max);

完整代码:

浅浅记录笔者自己的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
int tra(TreeNode* t,int max)
{
if(t==nullptr)
return 0;
if(t->val>=max)
{
max=t->val;
return tra(t->left,max)+tra(t->right,max)+1;
}
return tra(t->left,max)+tra(t->right,max);
}
int goodNodes(TreeNode* root) {
return tra(root,INT_MIN);
}
};

灵神写的简洁版代码

1
2
3
4
5
6
7
8
9
10
class Solution {
public:
int goodNodes(TreeNode *root, int mx = INT_MIN) {
if (root == nullptr)
return 0;
int left = goodNodes(root->left, max(mx, root->val));
int right = goodNodes(root->right, max(mx, root->val));
return left + right + (mx <= root->val);
}
};