西北工业大学NOJ数据结构—015建立二叉树的二叉链表储存结构




首先分析一下题意,通过一个类似于广义表的数据输入串来构建树,很明显是要通过递归定义来构建,讲真开始我也没思路(懵)偷一下某大佬的图


如果每次读入两个数据,那么就基本可以区分是根还是叶,如果出现了图中最下方两种情况,那就再读取一个,一定能判断出到底是叶子还是根节点

思路分析:

1.每次读入两个字符,如果是第一个字符是‘,’就要再读第三个,如果第三个为‘)’那么就停止,如果第三个是‘(’就再递归创建左子树右子树

2.如果第一个为字符,那么就直接把字符输入这个节点,如果第二个字符为‘(’,也依次递归创建左子树右子树。

3.自信分析,理性分析,胡乱分析,还行.......

就酱,代码(づ ̄3 ̄)づ╭❤~

#include <stdio.h>  
#include <stdlib.h>  
struct BinTree 
{//定义二叉链表储存二叉树
    char data;  
    struct BinTree *left;  
    struct BinTree *right;  
};  


struct BinTree *creat()  
{  //输入一串特殊形式的字符串创建二叉链表
    char s;  
    struct BinTree*cur;  
    s=getchar ();  //gerchar
    if (s>='A'&&s<='Z')  //如果是字母就创建一个节点
    {  
        cur=(struct BinTree*)malloc(sizeof(struct BinTree));  
        cur->data=s;  //这个节点的数据就是s
        cur->left=creat(); //依此递归创建二叉树的左子树和右子树 
        cur->right=creat();  
        return cur;  
    }  
    else  
    {  
        return NULL;  //在碰到特殊符号的时候返回这一支为NULL
    }  
}  
int GetLeaf(struct BinTree *T)  
{  
    int nLeft=0,nRight=0;  
    if (T->left==NULL&&T->right==NULL) 
        return 1;  //如果没有左子树没有右子树就是叶子 返回1个叶子
    if (T->left)  
        nLeft=GetLeaf(T->left); //有左边就递归计算左子树的叶子数 
    if (T->right)  
        nRight=GetLeaf(T->right); //右子树同理递归
    return nLeft+nRight;  //最后返回左子树右子树的叶子数加和
  
}  
int main()  
{  
    int n;  
    struct BinTree *T;  
    T=creat();  
    n=GetLeaf(T);  
    printf ("%d",n);  //输出叶子数
    return 0;  
}  
	 
		
		
		
		

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值