7-1 叶节点求和

对给定的有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;
}


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值