对给定的有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
思路如下:
这道题除了建立二叉树的做法外,用数组做这个题就显得比较简单了,首先用结构体数组去存储这个肯定是没有难度的,稍微要思考的就是怎么判断叶子结点,通过观察
我们可以发现,叶子结点在r中无法找到,所以我们接下来便是要将每个结构体的e于r去比较,如果没有相同的,就累加起来。
代码如下:
#include<stdio.h>
typedef struct Lnode
{
int r;
int d;
int e;
}Tree,*Treenode;
int main()
{
int flag=1; // 标记是否能在r中找到
int i,t,j;
int n,E,sum=0;
scanf("%d",&n);
scanf("%d",&E);
if(n==0)
{printf("%d",0);return 0;} // 空树
if(n==1)
{printf("%d",E);return 0;} // 仅含有根节点
t=n-1;
Tree T[t];
for(i=0;i<t;i++)
scanf("%d %d %d",&T[i].r,&T[i].d,&T[i].e);
for(i=0;i<t;i++)
{
flag=1;
for(j=0;j<t;j++)
if(T[i].e==T[j].r)
flag=0;
if(flag)
sum+=T[i].e;
}
printf("%d",sum);
}