内容:
(1) 先序创建二叉树;
(2) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的值;
(3) 实现二叉树的先序递归遍历,按先序遍历的次序显示各结点的度;
(4) 实现二叉树的中序递归遍历,按中序遍历的次序显示各结点的值;
(5) 实现二叉树的后序递归遍历,按后序遍历的次序显示各结点的值;
(6) 统计二叉树的结点数;
(7) 统计二叉树的叶结点数;
(8) 计算二叉树的深度;
(9) 销毁二叉树。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define OK 1
#define OVERFLOW -2
typedef int status;
int sum,du[100];
typedef struct BiTNode
{ // 结点结构
char data;
struct BiTNode *lchild, *rchild; // 左右孩子指针
}BiTNode,*BiTree;
status CreateBiTree(BiTree &T)
{ //以先序方式构造二叉树
char ch;
cin>>ch;
if (ch=='#') T=NULL;
else
{ T=new(BiTNode);
if(!T) exit(OVERFLOW);
T->data=ch;
T->lchild=T->rchild=NULL;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}//CreateBiTree
void Preorder(BiTree T)
{ // 先序遍历二叉树
if (T)
{ cout<<T->data; // 访问根结点
Preorder(T->lchild); //先序遍历左子树
Preorder(T->rchild); //先序遍历右子树
}// if
} // Preorder
int Nodes(BiTree T)
{ //先序计算结点个数
if (T==NULL) return 0;
else return (1+Nodes(T->lchild)+Nodes(T->rchild));
}// Nodes
bool Preorder_du(BiTree T)
{ // 先序遍历二叉树
if (T)
{
int s = 0;
if(Preorder_du(T->rchild))
s++; //先序遍历右子树
if(Preorder_du(T->lchild))
s++; //先序遍历左子树
//遍历必须反过来才行,因为把结果放入了数组中再倒序输出,所以必须先遍历右子树
du[sum++] = s;
return true;
}// if
return false;
} // Preorder
bool Midorder(BiTree T)
{
if(!T)
return false;
if(T->lchild)
Midorder(T->lchild);
cout << T->data;
if(T->rchild)
Midorder(T->rchild);
return true;
}
bool Lastorder(BiTree T)
{
if(!T)
return false;
if(T->lchild)
Lastorder(T->lchild);
if(T->rchild)
Lastorder(T->rchild);
cout << T->data;
return true;
}
int NodeCount(BiTree T)
{
if(!T) return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int YeNodeCount(BiTree T)
{
if(!T)
return 0;
if(!YeNodeCount(T->lchild)&&!YeNodeCount(T->rchild))
return 1;
else
return YeNodeCount(T->lchild)+YeNodeCount(T->rchild);
}
int Depth(BiTree T)
{
if(!T)
return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if(m>n)
return m+1;
else
return n+1;
}
}
void xiaohui(BiTree T)
{
if (T)
{
xiaohui(T->lchild); //先序遍历左子树
xiaohui(T->rchild); //先序遍历右子树
free(T);
}// if
} // Preorder
int main()
{
sum = 0;
BiTree T;
printf("1、请前序输入二叉树:" );
if(CreateBiTree(T))
printf("创建成功\n");
printf("2、先序遍历二叉树的值:");
Preorder(T);
cout << endl;
printf("3、先序遍历二叉树的度:");
Preorder_du(T);
for(int i = sum-1;i>=0;i--)
cout << du[i];
cout <<endl;
printf("4、中序遍历二叉树的值:");
Midorder(T);
cout << endl;
printf("5、后序遍历二叉树的值:");
Lastorder(T);
cout << endl;
printf("6、计算二叉树的结点数:%d\n",NodeCount(T));
printf("7、计算二叉树的叶结点数:%d\n",YeNodeCount(T));
printf("8、计算二叉树的深度:%d\n",Depth(T));
xiaohui(T);
printf("9、销毁成功");
return 0;
}
错误反思:实验的时候太心急了(为了限时内完成能加分),没多试几个测试(太自信了)。计算度的时候出现了点bug,顺序出现了错误,我的想法是先保存在数组中,再倒叙输出,可这样的话左右子树就会反过来,所以遍历顺序应该是右-->左-->中而不是左-->右-->中。