二叉树的多种遍历方式及相关应用
编译环境:Microsoft Visual C++2010学习版
参考教材:数据结构:C语言版/严蔚敏,李冬梅,吴伟民编
备注:本文留作作者自用,如有错误敬请指出
题目要求
(1)使用二叉链表定义二叉树结构
(2)编写二叉树的三种遍历方法
(3)输入一个二叉树,并能够先后按照三种遍历输出相应结果
(4)利用二叉树三种遍历(任选一种)求解相关实际问题
求解二叉树高度,求解二叉树结点总数,求解二叉树叶子结点总数,实现左右子树交换
实现代码
#include<iostream>
#include<cstdlib>
using namespace std;
typedef char TElemType;
TElemType ch;
int leaf=0;
typedef struct BiTNode{//使用二叉链表定义二叉树结构
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void InOrderTraverse(BiTree T){//中序遍历的递归算法
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
void PreOrderTraverse(BiTree T){//先序遍历的递归算法
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T){//后序遍历的递归算法
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
/*void InOrderTraverse(BiTree T){//中序遍历二叉树的非递归算法
InitStack(S);p=T;
q=new BiTNode;
while(p||!StackEmpty(S)){
if(p){
Push(S,p);
p=p->lchild;
}
else{
Pop(S,q);
cout<<q->data;
p=q->rchild;
}
}
}*/
void CreateBiTree(BiTree &T){//先序遍历的顺序建立二叉链表
cin>>ch;
if(ch=='#') T=NULL;
else{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->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 NodeCnt(BiTree T){//求结点个数
if(T)
return NodeCnt(T->lchild)+NodeCnt(T->rchild)+1;
else
return 0;
}
int LeafCnt(BiTree T){//求解二叉树叶子结点总数
if(T==NULL)
return 0;
else{
int m=LeafCnt(T->lchild),n=LeafCnt(T->rchild);
if(!m&&!n)
leaf++;
return 1;
}
}
void exchange(BiTree T,BiTree &NewT){//交换左右子树
if(T==NULL){
NewT=NULL;
return;
}
else{
NewT=new BiTNode;
NewT->data=T->data;
exchange(T->lchild,NewT->rchild);
exchange(T->rchild,NewT->lchild);
}
}
int main(void){
BiTNode *T,*NewT;
cout<<"先序遍历建立二叉树:";
CreateBiTree(T);
cout<<"中序遍历:";
InOrderTraverse(T);
cout<<endl<<"先序遍历:";
PreOrderTraverse(T);
cout<<endl<<"后序遍历:";
PostOrderTraverse(T);
cout<<endl<<"树的高度为:"<<Depth(T)<<endl;
cout<<"树中结点个数为:"<<NodeCnt(T)<<endl;
LeafCnt(T);
cout<<"树中叶子结点个数为:"<<leaf<<endl;
leaf=0;
cout<<"---交换左右子树---"<<endl;
exchange(T,NewT);
cout<<"中序遍历:";
InOrderTraverse(NewT);
cout<<endl<<"先序遍历:";
PreOrderTraverse(NewT);
cout<<endl<<"后序遍历:";
PostOrderTraverse(NewT);
cout<<endl<<"树的高度为:"<<Depth(NewT)<<endl;
cout<<"树中结点个数为:"<<NodeCnt(NewT)<<endl;
LeafCnt(NewT);
cout<<"树中叶子结点个数为:"<<leaf<<endl;
system("pause");
return 0;
}
//输入abd#e##fg###c##