对给定的有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
#include<stdio.h>
typedef struct node
{
int r;//父节点
int d;//表示左孩子还是右孩子,左为0右为1
int e;//该节点元素值
int flag;//
}tree,*Treeptr;
//然后使用 typedef 关键字将 Lnode 重命名为 Tree,
//并定义一个指向 tree 结构体类型的指针 Tree。
//C语言中的结构体定义不支持在结构体内部直接初始化成员变量
int main()
{
int n;//n个节点
scanf("%d",&n);
int k;//根节点的值
scanf("%d",&k);
//int t=n-1;
int i;
tree t[n-1];//定义的应该是结构体本身而不是指针
//记一下报错
//Tree 是一个指向结构体 node 的指针类型,而不是结构体类型本身。
//因此,在 scanf 函数中使用 Tree 是不正确的,
//因为它不是一个具有结构或联合类型的表达式。
//如果你想使用 scanf 函数来读取输入并存储到 tree 数组中的结构体变量中,
//你应该使用 Tree 的指针类型 TreePtr。
if(n==0)
{printf("%d",0);return 0;} // 空树
if(n==1)
{printf("%d",k);return 0;} // 仅含有根节点
for(int i=0;i<n-1;i++)
{
t[i].flag=1;//表示是叶子节点
scanf("%d %d %d",&t[i].r,&t[i].d,&t[i].e);
}
int sum=0;
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1;j++)
{
if(t[i].e==t[j].r)
t[i].flag=0;
}
if(t[i].flag)
{
sum=sum+t[i].e;
}
}
printf("%d",sum);
return 0;
}