7-12 叶节点求和 (20 分)
对给定的有N
个节点(N>=0
)的二叉树,求叶节点元素之和。
输入格式:
第一行是一个非负整数N
,表示有N
个节点
第二行是一个整数k
,是树根的元素值
接下来有N-1
行,每行是一个新节点,格式为 r d e
三个整数,
r
表示该节点的父节点元素值(保证父节点存在);d
是方向,0
表示该节点为父节点的左儿子,1
表示右儿子;e
是该节点的元素值。
输出格式:
树中叶节点元素之和 (保证在整型变量范围之内)。
输入样例:
对于图片中的二叉树:
3
20
20 0 10
20 1 25
输出样例:
35
AC
没有构造二叉树,我觉得没有必要,挺麻烦的!
开始的时候一直是18分,不知道漏掉了什么情况,去看了别人的博客发现这张图
我的pta没有提示,第三个测试点是错的,改正之后就通过了。
果然有时候是要猜测试点的。。。
#include<bits/stdc++.h>
using namespace std;
struct note {
int father;//我的父亲节点
int me;//本节点的值
int flag;//我是左还是右孩子
};
int main() {
int n,k;
cin>>n>>k;
set<int> s;
note a[n];
s.insert(k);
for(int i=0; i<n-1; i++) {
int r,d,e;
cin>>r>>d>>e;
s.insert(r);//将所有的父亲节点记录下来
a[i].father=r;
a[i].me=e;
a[i].flag=d;
}
if(n==1){
cout<<k<<endl;//添加对仅有树根的判断
return 0;
}
int num=0;
for(int i=0; i<n-1; i++) {
if(s.find(a[i].me)==s.end()) { //找不到,我不是父亲节点
num=num+a[i].me;
}
}
cout<<num<<endl;
return 0;
}