二叉树的基本操作
1)编写完成下列功能的函数:(1)构建二叉树;(2)中序遍历二叉树;(3)求二叉树
的深度;(4)求二叉树中叶子结点个数;( 5)求二叉树中结点的个数;(6)求二叉树中度为1 的结点个数。
二叉树的二叉链表存储结构的定义
typedef struct BiTNode { // 结点结构
TElemType data;
struct BiTNode *lchild, *rchild; // 左右孩子指针
} BiTNode, *BiTree;
注意:输入时是利用扩展二叉树的先序序列构造二叉树的二叉链表存储,如树
输入是应为该树的完全二叉树的先序序列:ab##c##
根据树的定义,树的操作多用递归。
#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct BiTNode { // 结点结构
char data;
struct BiTNode *lchild,*rchild; // 左右孩子指针
} BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{//利用扩展二叉树的先序序列构造二叉树的二叉链表存储
char ch;
//scanf("%c",&ch);
ch = getchar();
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("%c ",T->data); // 访问根结点
InOrderTraverse(T->rchild); //中序遍历右子树
}
}
int Depth(BiTree T)
{ //求二叉树的深度
if (!T)
return 0;
else
{
int d1= Depth(T->lchild);
int d2= Depth(T->rchild);
return(1+(d1>d2?d1:d2)); //左子树、右子树深度的最大值+1
}
}
int Number(BiTree T)
{ //求二叉树上结点个数
if (!T)
return 0;
else
{
int m1=Number(T->lchild);
int m2=Number(T->rchild);
return(1+m1+m2); //左子树上结点数+右子树上结点数+1
}
}
int Leaf(BiTree T)
{ //求二叉树叶子结点个数
if (!T)
return 0;
else if((!T->lchild)&&(!T->rchild))
return 1;
else //左子树上的叶子数+右子树上的叶子数
return(Leaf(T->lchild)+Leaf(T->rchild));
}
int Number1(BiTree T)
{ //二叉树上度为1结点个数
if (!T)
return 0;
else if (((!T->lchild) && (T->rchild)) || ((T->lchild) && (!T->rchild)))
return 1;
else
{
int m1=Number1 (T->lchild);
int m2=Number1 (T->rchild);
return(m1+m2);
}
}
void Destory(BiTree T)
{ // 销毁二叉树
if (T)
{
Destory (T->lchild ); //销毁遍历左子树
Destory (T->rchild ); //销毁遍历右子树
free(T); // 释放结点
}
}
int main()
{
int a,k,f,x,i,j,ch;
//i1,x1,i2,x3,k,f;
BiTree T;
for(k = 0;;k++)
{
printf("\n1.创建一个二叉树\n");
printf("2.中序遍历二叉树\n");
printf("3.二叉树深度\n");
printf("4.二叉树节点数\n");
printf("5.二叉树叶子节点数\n");
printf("6.二叉树度为1节点数\n");
printf("7.退出程序\n");
printf("输入你的选择:\n");
scanf("%d",&a);
switch (a)
{
case 1:
printf("扩展二叉树的先序序列为:\n");
scanf("%c",&ch);
CreateBiTree(T);
break;
case 2:
printf("中序序列为:\n");
InOrderTraverse(T);
break;
case 3:
f = Depth(T);
printf("深度为:%d",f);
break;
case 4:
x = Number(T);
printf("节点数为:%d",x);
break;
case 5:
i = Leaf(T);
printf("叶子数为:%d",i);
break;
case 6:
j = Number1(T);
printf("度为1节点数为:%d",j);
break;
case 7:Destory(T);
exit(0);
}
}
return OK;
}