LeetCode树——好叶子节点对的数量(C++)_商业

题目描述

给你二叉树的根节点 root 和一个整数 distance 。

如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。

返回树中 好叶子节点对的数量 。

示例 1:

LeetCode树——好叶子节点对的数量(C++)_子树_02

输入:root = [1,2,3,null,4], distance = 3

输出:1

解释:树的叶节点是 3 和 4 ,它们之间的最短路径的长度是 3 。这是唯一的好叶子节点对。

示例 2:

LeetCode树——好叶子节点对的数量(C++)_商业_03

输入:root = [1,2,3,4,5,6,7], distance = 3

输出:2

解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。

示例 3:

输入:root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3

输出:1

解释:唯一的好叶子节点对是 [2,5] 。

示例 4:

输入:root = [100], distance = 1

输出:0

示例 5:

输入:root = [1,1,1], distance = 2

输出:1

提示:

tree 的节点数在 [1, 2^10] 范围内。

每个节点的值都在 [1, 100] 之间。

1 <= distance <= 10

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/number-of-good-leaf-nodes-pairs

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

这一题的思路感觉好难啊!还是巴巴地看了题解。嘤嘤嘤!

​高赞答案​​的思路挺好理解的,首先对该树进行遍历,之后将每个节点所有的左子树上的叶子节点与所有的右子树上的叶子节点进行两两配对,记录满足distance要求的节点对数。

代码作者是这样写的。

class Solution {
public:
int countPairs(TreeNode* root, int distance) {
int ans = 0;
dfs(root, distance, ans);
return ans;
}

vector<int> dfs(TreeNode* root, int distance, int& ans) {
if (root == nullptr) return {};
if (root->left == nullptr && root->right == nullptr) return { 0 };

vector<int> ret;//
auto left = dfs(root->left, distance, ans);
for (auto& e : left) {
if (++e > distance) continue;//如果高度大于distanced的话,直接不满足条件,跳过;否则进行存储
ret.push_back(e);
}
auto right = dfs(root->right, distance, ans);
for (auto& e : right) {
if (++e > distance) continue;
ret.push_back(e);
}

for (auto l : left) {
for (auto r : right) {
ans += (l + r <= distance);//当左右叶子节点距离小于distance时,则结果加1.
}
}

return ret;
}
};

这里刚开始很奇怪,怎么把左右子树的高度都存储到ret里啦???后来仔细分析一下,ret的功能其实是每次把得到的左右叶子节点保留下来并且高度加1,以备后面使用。