1530. 好叶子节点对的数量
难度中等
给你二叉树的根节点 root 和一个整数 distance 。
如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。
返回树中 好叶子节点对的数量 。
示例 1:
输入:root = [1,2,3,null,4], distance = 3
输出:1
解释:树的叶节点是 3 和 4 ,它们之间的最短路径的长度是 3 。这是唯一的好叶子节点对。
示例 2:
输入:root = [1,2,3,4,5,6,7], distance = 3
输出:2
解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。
(1)tree 的节点数在 [1, 2^10] 范围内。
(2)每个节点的值都在 [1, 100] 之间。
(3)1 <= distance <= 10
思路1.0(已看题解):
想过保存每个节点到他子节点的距离,但压根不知道怎么实现,看了题解有个用后序遍历的方法。
在每次遍历时返回一个vector数组保存结果(自己一开始想着再创建一个节点数据结构不同的树。。我在想啥),因为需要收集左右子树的信息才能判断结果,所以采用后序遍历。
代码1.0(已完成):
class Solution {
public:
int countPairs(TreeNode* root, int distance) {
int rst = 0;
findPairs(root, distance, rst);
return rst;
}
vector<int> findPairs(TreeNode* Tnode, const int& distance, int& rst)
{
if (Tnode == NULL) return{};
//如果是叶节点,返回一个距离为0的vec
if (Tnode->left == NULL && Tnode->right == NULL) return{ 0 };
//最终要返回给上一层的,该点到左右子树里所有叶节点的距离
vector<int> total;
//遍历该点到左子树里所有叶节点有效距离
vector<int> left = findPairs(Tnode->left, distance, rst);
for (auto& i : left)
{
if (++i >= distance)
continue;
total.push_back(i);
}
//遍历该点到右子树里所有叶节点有效距离
vector<int> right = findPairs(Tnode->right, distance, rst);
for (auto& i : right)
{
if (++i >= distance)
continue;
total.push_back(i);
}
//检验该点有多少好叶子节点对
for (auto& i : left)
{
for (auto& j : right)
{
if ((i + j) <= distance)
rst++;
}
}
//返回给上层,该点到所有叶子节点的有效距离
return total;
}
};