对给定的有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>
#include <malloc.h>
typedef struct BTree//建立节点;
{
int data;
struct BTree *Lson;
struct BTree *Rson;
}BTree;
struct BTree* createNode(int item)//创建节点,并对其分配空间,赋值。
{
struct BTree *T;
T=(BTree*)malloc(sizeof(BTree));
T->data=item;
T->Lson=NULL;//*****本人错误点:*****左右孩子未置空(若不置空,则在插入节点时不能插入,因为此处非空,如56,62行所示)。
T->Rson=NULL;
return T;
};
struct BTree* createBinTree()//对树构建。
{
int total, data;
scanf("%d",&total);//节点数,包括根。
if(total == 0) return NULL;
scanf("%d",&data);
struct BTree *bt;
bt = createNode(data);//创建根节点。
if(!bt) return NULL;
int parent, dir;
for(int i=1; i<total; i++){
scanf("%d%d%d",&parent,&dir,&data);
insert(bt, parent, dir, data);//将子节点据父亲数值,及0,1关系插入相应位置。
}
return bt;
}
struct BTree *findNode(struct BTree *bt,int item)//根据父亲节点数值在树中查找父亲节点(先序遍历查找)。
{
if(bt!=NULL)
{
if(bt->data==item) return bt;//父亲节点为根节点。
else
{
BTree *team;//存放根节点后代中目标节点。
team=findNode(bt->Lson,item);
if(team==NULL) team=findNode(bt->Rson,item);
return team;//返回节点。
}
}
return NULL;//没有找到。
}
int insert(struct BTree *bt, int parent, int dir, int item)
{
struct BTree *tmp;
tmp = findNode(bt, parent);//在树中寻找父亲节点。
if(!tmp) return 0;
if(dir == 0)//左孩子
{
if(tmp->Lson) return 0;
tmp->Lson = createNode(item);//插入父亲左孩子位置。
if(tmp->Lson == NULL) return 0;
}
else//右孩子。
{
if(tmp->Rson) return 0;
tmp->Rson = createNode(item);//插入父亲右孩子位置。
if(tmp->Rson == NULL) return 0;
}
return 1;
}
int sumLeaf(BTree *T)
{
if(T==NULL) return 0;
else if(!(T->Lson)&&!(T->Rson)) return(T->data);//叶子节点。
else return (sumLeaf(T->Lson)+sumLeaf(T->Rson));//查找后代中的叶子节点。
}
int main()
{
struct BTree *T;
T=createBinTree();//构建树。
printf("%d",sumLeaf(T));//叶子节点求和。
return 0;
}