好叶子节点对的数量(后序遍历DFS)
问题:
思路:
我们需要知道节点的叶子节点到节点的距离,从中选取满足条件的叶节点对
通过后序遍历DFS分别构造节点的叶子节点到节点的左孩子的距离以及节点的叶子节点到节点的右孩子距离,通过这两个距离构造节点的叶子节点到节点的距离
DFS的返回值为vector< int >,表示节点的叶节点到节点的距离,通过DFS,我们可以知道叶节点到节点的左孩子的距离以及到节点的右孩子的距离,这两个距离+1即为叶节点到节点的距离,若有满足条件的距离,将此距离加入到保存叶节点到节点的距离的vector中
再从保存叶节点到节点的左孩子距离的vector以及保存到右孩子距离的vector中各选一个距离,若距离之和满足条件,则满足条件的叶节点对数量+1
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> dfs( TreeNode* root,int distance,int& ans )
{
if( root==NULL )
return {};
else if( root->left==NULL && root->right==NULL )
return {0};
vector<int> root_leaf;
vector<int> left_leaf;
left_leaf=dfs( root->left,distance,ans );
vector<int> right_leaf;
right_leaf=dfs( root->right,distance,ans );
for( auto x:left_leaf )
{
x++;
if( x<=distance )
root_leaf.push_back( x );
}
for( auto y:right_leaf )
{
y++;
if( y<=distance )
root_leaf.push_back( y );
}
for( auto xx:left_leaf )
for( auto yy:right_leaf )
{
if( xx+yy+2<=distance )
ans++;
}
return root_leaf;
}
int countPairs(TreeNode* root, int distance) {
int ans=0;
dfs( root,distance,ans );
return ans;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153822.html