Bootstrap

二叉树的多种遍历方式及相关应用

二叉树的多种遍历方式及相关应用

编译环境: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##

运行结果

在这里插入图片描述

;