这个题显然是非常经典的二叉树创建模型,输入字符串而且用特殊字符来表示空节点,用先序输入,显然最好用递归来创建会非常方便(递归大法好),在二叉树的应用中递归确实非常方便,计算机帮我们解决了所有的入栈出栈问题
那么解题思路为
1.创建递归函数,getchar一个字符,如果这个字符是字母,那么就递归先后创建它的左子树和右子树,如果是特殊字符#,那么就返回一个空指针,不再创建子树。通过这个函数可以输入字符串来创建二叉树
2.写一个能够得到叶子数目的函数。由以下递归部分组成,1)如果节点的左右子树都为NULL,那么直接返回叶子节点为1;2)如果节点左子树存在就递归得到左子树的叶子数目;3)如果节点右子树存在就递归得到右子树的椰子树;4)返回左右子树叶子的数目和。通过这个递归可以直接得到整棵树的叶子数目
下面,荆轲刺秦王,上代码(づ ̄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;
}
最后
以上就是外向钢笔最近收集整理的关于西北工业大学NOJ数据结构—016计算二叉树叶子节点的数目的全部内容,更多相关西北工业大学NOJ数据结构—016计算二叉树叶子节点内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复