碎碎念:
五一调休,只放周六一天,大周六跑来上机,我太南了呜呜呜呜呜呜~
中间段的字符输入,这BUG简直就离谱,一边调程序一边抹眼泪 (想中午吃啥哈哈哈哈)
问题:
二叉树采用二叉链表存储,试设计算法实现:
1.CreateBT(BiTree &T):从键盘输入二叉树的先序遍历序列字符串(以”#”代表空结点),建立其二叉链表;如输入:AB#D##CE#F### 则建立如下图所示二叉树的二叉链表
2.CountLeaf(BiTree T, TElemType x, int &count): 统计以值为x的结点为根的子树中叶子结点的数目;
3.DispBiTree(BiTree T, int level) : 按树状打印二叉树。
分析:无,常规的二叉树操作
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
typedef char TElemType;
typedef int Status;
//结构体定义
typedef struct BiTNode
{
TElemType data;//数据域
struct BiTNode *lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
//先序遍历序列字符串建造二叉树
Status CreateBT(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else{
T=(BiTNode*)malloc(sizeof(BiTNode));
T->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
}
return OK;
}
//先序遍历输出二叉树
Status PrintBT(BiTree T)
{
if(T)
{
printf("%c",T->data);
PrintBT(T->lchild);
PrintBT(T->rchild);
}
return OK;
}
//先序遍历找到以值为x的结点为根的子树
BiTree PreOrderTraverseSeek(BiTree T,char x)
{
if(T)
{
if(T->data==x)
return T;
BiTree q=NULL;
q=PreOrderTraverseSeek(T->lchild,x);
if(q) return q;
q=PreOrderTraverseSeek(T->rchild,x);
if(q) return q;
}
return NULL;
}
//统计叶子结点的数目
Status LeafCount(BiTree T)
{
if(!T) return 0;
if(!(T->lchild)&&!(T->rchild)) return 1;
return LeafCount(T->lchild)+LeafCount(T->rchild);
}
//统计以值为x的结点为根的子树中叶子结点的数目
Status CountLeaf(BiTree T, char x, int &count)
{
BiTree q=NULL;
q=PreOrderTraverseSeek(T,x);//q指向以值为x做结点的指针
count=LeafCount(q);//计数
return OK;
}
//按树状打印二叉树(后序)
Status DispBiTree(BiTree T, int level)
{
if(T)
{
DispBiTree(T->rchild,level-1);
for(int i=0;i<4-level;i++)
printf("#");
printf("%c\n",T->data);
DispBiTree(T->lchild,level-1);
}
}
//主函数运行
int main()
{
BiTree T;
char ch;
int count=0;
int level=4;
//先序遍历序列字符串建造二叉树
CreateBT(T);
PrintBT(T);
printf("\n");
printf("二叉树构建正确!\n");
//按树状打印二叉树
DispBiTree(T,level);
//统计以值为x的结点为根的子树中叶子结点的数目
printf("请输入x的值,以统计以值为x的结点为根的子树中叶子结点的数目: \n");
ch=getchar();
scanf("%c",&ch);
CountLeaf(T,ch,count);
printf("以值为x的结点为根的子树中叶子结点的数目为:%d\n",count);
return OK;
}
附运行结果如下: