对给定的有N个节点(N>=0)的二叉树,求叶节点元素之和。
输入格式:
第一行是一个非负整数N,表示有N个节点
第二行是一个整数k,是树根的元素值
接下来有N-1行,每行是一个新节点,格式为 r d e 三个整数,
r表示该节点的父节点元素值(保证父节点存在);d是方向,0表示该节点为父节点的左儿子,1表示右儿子;e是该节点的元素值。
输出格式:
树中叶节点元素之和 (保证在整型变量范围之内)。
输入样例:
fig.jpg
对于图片中的二叉树:
3
20
20 0 10
20 1 25
注意:本题题目虽未说明各节点元素不同,但默认为不同。
//P8 叶节点求和
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int main()
{
map<int,vector<int>> m;
int n,k,number=0;
cin>>n>>k;
if(n==1)
{
cout<<k<<endl;
return 0;
}
for(int i=0;i<n-1;i++)
{
int r,d,e;
cin>>r>>d>>e;
m[r].push_back(e);
}
for(auto i=m.begin();i!=m.end();i++)
{
for(int j=0;j<i->second.size();j++)
{
auto p=m.find(i->second[j]);
if(p==m.end())
{
if(m.end()->first!=i->second[j])//如果子节点等于父节点。。。
number+=i->second[j];
}
}
}
cout<<number<<endl;
}
接下来就是建树的常规解法了
```cpp
//P8的常规解法
#include<iostream>
using namespace std;
int r,yz=0;
typedef struct tree* BT;
struct tree{
int data;
BT left;
BT right;
};
BT wz=new tree();// wz用来记住r的位置
void insert(BT root)
{
if(root){
insert(root->left);
if(root->data==r)
{
wz=root;
return;
}
insert(root->right);
}
}
void bl(BT root)//书上有,就照搬了
{
if(root){
if(!root->left&&!root->right)
yz+=root->data;
bl(root->left);
bl(root->right);
}
}
int main()
{
int n;
cin>>n>>r;
BT root=new tree();
root->data=r;
root->left=NULL;
root->right=NULL;
for(int i=0;i<n-1;i++)
{
int d,e;
cin>>r>>d>>e;
BT node=new tree();
insert(root);
node=wz;
if(d==0)
{
BT t=new tree();
node->left=t;
t->data=e;
t->left=NULL;
t->right=NULL;
}
else
{
BT t=new tree();
node->right=t;
t->data=e;
t->left=NULL;
t->right=NULL;
}
}
bl(root);
cout<<yz<<endl;
}