要求:
(1)创建一棵二叉树(用键盘按照先序遍历序列输入一个字符串生成二叉树);
(2)输出前序、中序、后序遍历的遍历序列;
(3)统计并输出二叉树的的结点个数;
(4)输出二叉树的叶子结点的个数;
代码块:
按先序遍历输入字符,创建一颗二叉树。
注意:scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,导致无法的输入字符数据。所以采用在scanf()格式串前加空格的方式,屏蔽回车字符。
void CreateBiTree(BiTree *T)
{
char ch;
scanf(" %c",&ch);
if (ch =='#') *T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
遍历:
void InOrderTraverse(BiTree T)
{//中序遍历
if(T)
{
InOrderTraverse(T->lchild);
printf("%4c",T->data);
InOrderTraverse(T->rchild);
}
}
void PreOrderTraverse(BiTree T)
{//先序遍历
if(T)
{
printf("%4c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{//后序遍历
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%4c",T->data);
}
}
统计结点个数和叶子结点的个数:
int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
if (T == NULL) return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
//结点个数为左右子树结点个数之和+1(根节点)
}
int LeafNodeCount(BiTree T)
{//统计二叉树中叶子结点的个数
static int LeafNum=0;
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
LeafNum++;
LeafNodeCount(T->lchild);
LeafNodeCount(T->rchild);
}
return LeafNum;
}
全部代码:
//按照先序遍历的次序键盘输入字符串,按照满二叉树的特点生成一棵二叉树
//输出前序、中序、后序遍历
//统计并输出二叉树的的结点个数;
//输出二叉树的叶子结点的个数;
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data; //结点数据域
struct BiTNode *lchild, *rchild; //左右孩子指针
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T)
{
char ch;
scanf(" %c",&ch);
if (ch =='#') *T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
void InOrderTraverse(BiTree T)
{//中序遍历
if(T)
{
InOrderTraverse(T->lchild);
printf("%4c",T->data);
InOrderTraverse(T->rchild);
}
}
void PreOrderTraverse(BiTree T)
{//先序遍历
if(T)
{
printf("%4c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{//后序遍历
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%4c",T->data);
}
}
int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
if (T == NULL) return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
//结点个数为左右子树结点个数之和+1(根节点)
}
int LeafNodeCount(BiTree T)
{//统计二叉树中叶子结点的个数
static int LeafNum=0;
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
LeafNum++;
LeafNodeCount(T->lchild);
LeafNodeCount(T->rchild);
}
return LeafNum;
}
int main()
{
BiTree T=NULL;
int n,m;
printf("按先序遍历的顺序输入:");
CreateBiTree(&T);
printf("中序遍历:");
InOrderTraverse(T);
printf("\n");
printf("先序遍历:");
PreOrderTraverse(T);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(T);
printf("\n");
n = NodeCount(T);
printf("二叉树中结点的个数为:%d", n);
m=LeafNodeCount(T);
printf("二叉树中叶子结点的个数为:%d", m);
return 0;
}