先来看一下实现效果:
介绍一下三种遍历方式:
- 先序遍历:访问 -> 左 -> 右
- 中序遍历:左 -> 访问 -> 右
- 后序遍历:左 -> 右 -> 访问
主要实现方法:递归
#include<iostream>
using namespace std;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序创建二叉树
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch=='#')
T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
else
{
cout << T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
else
{
InOrderTraverse(T->lchild);
cout <<T->data;
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout <<T->data;
}
}
//复制二叉树
void Copy(BiTree T,BiTree &NewT)
{
if(T==NULL)
{
NewT=NULL;
return;
}
else
{
NewT=new BiTNode;
NewT->data=T->data;
Copy(T->lchild,NewT->lchild);
Copy(T->rchild,NewT->rchild);
}
}
//计算二叉树的深度
int Depth(BiTree T)
{
if(T==NULL)
return 0;
else
{
int m=Depth(T->lchild);
int n=Depth(T->rchild);
if(m>n)
return m+1;
else
return n+1;
}
}
//统计二叉树中结点的个数
int NodeCount(BiTree T)
{
if(T==NULL)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int main()
{
BiTree T;
BiTree A;
CreateBiTree(T);
cout << "先序遍历: ";
PreOrderTraverse(T);
cout <<endl;
cout << "中序遍历: ";
InOrderTraverse(T);
cout <<endl;
cout << "后序遍历: ";
PostOrderTraverse(T);
cout << endl;
cout << "复制二叉树T到A: ";
Copy(T,A);
PreOrderTraverse(A);
cout << endl;
cout << "计算二叉树T的深度: ";
cout << Depth(T) <<endl;
cout << "二叉树中结点个数: ";
cout << NodeCount(T) <<endl;
return 0;
}