对建立的二叉树进行先序遍历,中序遍历,后序遍历,求树的深度,叶子结点个数。
#include <stdio.h>
#include <stdlib.h>
struct btnode
{
char data;//数据域
struct btnode *lchild,*rchild;//左孩子,右孩子
};
typedef struct btnode bitreptr;//重新命名
int n=0;
bitreptr* creatbt()//创建二叉树
{
bitreptr *r;
char ch;
scanf("%c",&ch);
getchar();//吸收回车键
if (ch==' ')
r=NULL;
else
{
r=(struct btnode*)malloc(sizeof(struct btnode));
r->data=ch;
printf("输入%c的左子树:",ch);
r->lchild=creatbt();//递归左子树
printf("输入%c的右子树:",ch);
r->rchild=creatbt();//递归右子树
}
return r;
}
void preorder(bitreptr *r)//先序遍历
{
if(r)
{
printf("%c",r->data);
preorder(r->lchild);//递归调用
preorder(r->rchild);
}
}
void inorder(bitreptr *r)//中序遍历
{
if(r)
{
inorder(r->lchild);
printf("%c",r->data);
inorder(r->rchild);
}
}
void postorder(bitreptr *r)//后序遍历
{
if(r)
{
postorder(r->lchild);
postorder(r->rchild);
printf("%c",r->data);
}
}
int depth(bitreptr *r)//数的深度
{
int k=0;
int leftdeep,rightdeep;//定义遍历时的左子树深度和右子树深度
if(r)
{
leftdeep=depth(r->lchild);//左子树的深度
rightdeep=depth(r->rchild);//右子树的深度
k=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;//取左右子树最大值,+1是每次递归子树到根结点长度
}
return k;
}
int count(bitreptr *r)//树的叶子节点个数
{
if(r)
{
if((r->lchild==NULL)&&(r->rchild==NULL))//判断是否是叶子结点
n++;
count(r->lchild);//递归调用
count(r->rchild);
}
return n;
}
void main()
{
int deep;//深度
int counts;//叶子结点个数
bitreptr *R;
printf("创建二叉树(若某个结点左或右子树为空,则输入空格!)\n");
printf("输入根结点:");
R=creatbt();//创建二叉树
printf("\n先序遍历:");
preorder(R);//先序遍历
printf("\n");
printf("\n中序遍历:");
inorder(R);//中序遍历
printf("\n");
printf("\n后序遍历:");
postorder(R);//后序遍历
printf("\n");
deep=depth(R);//树的深度
printf("\n树的深度:%d\n",deep);
counts=count(R);//叶子结点个数
printf("\n树的叶子结点个数:%d\n",counts);
}
运行结果:
C++实现
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//构造二叉树
BiTree createBiTree(){
BiTNode *r;
char s;//结点
cin>>s;
if(s=='#'){
r=NULL;
}
else{
r=(BiTNode *)malloc(sizeof(BiTNode *));
r->data=s;
cout<<"输入 "<<s<<" 的左孩子结点('#'表示为空):";
r->lchild=createBiTree();//递归输入当前根结点的左子树
cout<<"输入 "<<s<<" 的右孩子结点('#'表示为空):";
r->rchild=createBiTree();//递归右子树
}
return r;
}
void visit(BiTNode *T){
if(T!=NULL){
cout<<T->data<<endl;
}
}
//先序
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
//后序
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}