二叉树(前中后序递归非递归遍历,层次遍历,C++实现)
- by Hector
[CODE=cplusplus]
/*//////////////////////////////////////////////////////////////////////////////
// 名 称 (Unit Name): BiTree.h 二叉树头文件
// 作 者 ( Author ): Hector(张伟)
// 邮 箱 ( E-mail ): ourys@qq.com
// 支 持 ( Support ): http://www.ourys.com
// 备 注 ( Remarks ): 包含文件栈的地址:http://www.ourys.com/post/38.html, 包含文件队列的地址:http://www.ourys.com/post/38.html
//////////////////////////////////////////////////////////////////////////////*/
#ifndef _BITREE_H
#define _BITREE_H
#include “Stack.h”
#include “Queue.h”
template
class BiTree; //友元类引用申明
/*——– 树的节点定义,将BiTree定义为友元类,便于对其操作 ———–*/
template
class TreeNode
{
TreeNode():lchild(NULL),rchild(NULL){}
friend class BiTree
private:
DataType data;
TreeNode *lchild,*rchild;
//bool tag; //后序遍历时用的标志域
};
/*——– 二叉树树开始 ———–*/
template
class BiTree{
public:
void CreateBiTree(); //创建根节点——主过程
void CreateBiTree(TreeNode
void PreROrderTraverse(); //递归——先序遍历二叉树—主过程
void PreROrderTraverse(TreeNode
void InROrderTraverse(); //递归——中序遍历二叉树—主过程
void InROrderTraverse(TreeNode
void PosROrderTraverse(); //递归——后序遍历二叉树—主过程
void PosROrderTraverse(TreeNode
void PreOrderTraverse(); //非递归——中序遍历二叉树
void InOrderTraverse(); //非递归——中序遍历二叉树
void PosOrderTraverse(); //非递归——后序遍历二叉树
void LevelOrderTraverse(); //非递归——层次遍历二叉树
protected:
TreeNode
DataType temp; //代表元素为空的符号
};
/*——– 创建根节点—-主过程————–*/
template
void BiTree
{
cout<<"请输入代表元素为空的符号:";
cin>>temp; //若换输入方式,以上三句可以去掉
if(!(root=(TreeNode
cout<<"请输入数据:"<
}
/*——–创建节点函数—-子过程————–*/
template
void BiTree
{
TreeNode
if(!(px=(TreeNode
cin>>px->data;
if(px->data==temp) {p=NULL;free(px);}
else{
p=px;
// p->tag=false; //后序遍历时用的标志域初始化
CreateBiTree(px->lchild);
CreateBiTree(px->rchild);
}
}
/*——– 递归——先序遍历二叉树—主过程 ————–*/
template
void BiTree
{
PreROrderTraverse(root);
}
/*——– 递归——先序遍历二叉树—子过程 ————–*/
template
void BiTree
{
if(p){
cout<
PreROrderTraverse(p->lchild);
PreROrderTraverse(p->rchild);
}
}
/*——– 递归——中序遍历二叉树—主过程 ————–*/
template
void BiTree
{
InROrderTraverse(root);
}
/*——– 递归——中序遍历二叉树—子过程 ————–*/
template
void BiTree
{
if(p){
InROrderTraverse(p->lchild);
cout<
InROrderTraverse(p->rchild);
}
}
/*——– 递归——后序遍历二叉树—主过程 ————–*/
template
void BiTree
{
PosROrderTraverse(root);
}
/*——– 递归——后序遍历二叉树—子过程 ————–*/
template
void BiTree
{
if(p){
PosROrderTraverse(p->lchild);
PosROrderTraverse(p->rchild);
cout<
}
}
/*——– 非递归——前序遍历二叉树————–*/
template
void BiTree
{
Stack
TreeNode
p=root;
while(p||!S.StackEmpty()){
if(p){S.Push(p);cout<
else{
S.Pop(p);
p=p->rchild;
}
}
S.DestroyStack();
}
/*——– 非递归——中序遍历二叉树————–*/
template
void BiTree
{
Stack
TreeNode
p=root;
while(p||!S.StackEmpty()){
if(p){S.Push(p); p=p->lchild;}
else{
S.Pop(p);
cout<
p=p->rchild;
}
}
S.DestroyStack();
}
/*——–非递归——后序遍历二叉树(没有使用标志域)————–*/
template
void BiTree
{
Stack
TreeNode
TreeNode
p=root;
while(p||!S.StackEmpty())
{
if(p){S.Push(p);p=p->lchild;}
else{
S.GetTop(p);
if(p->rchild&&p->rchild!=r){p=p->rchild;S.Push(p);p=p->lchild;}
else{S.Pop(p);cout<
}
}
S.DestroyStack();
}
/*——–非递归——后序遍历二叉树(运用标志域,使用时请将有关tag的注释取消掉)————–*/
//template
//void BiTree
//{
// Stack
// TreeNode
// p=root;
// while(p||!S.StackEmpty())
// {
// if(p){S.Push(p); p->tag=true;p=p->lchild;}
// else{
// S.GetTop(p);
// if(p->rchild&&!p->rchild->tag){
// p=p->rchild;S.Push(p);p->tag=true;p=p->lchild;
// }
// else{S.Pop(p);cout<
// }
// }
// S.DestroyStack();
//}
/*——– 非递归——层次遍历二叉树 ————–*/
template
void BiTree
{
Queue
TreeNode
qu.EnQueue(root);
while(!qu.QueueEmpty()){
qu.DeQueue(p);
cout<
if (p->lchild!= NULL) qu.EnQueue(p->lchild);
if (p->rchild!= NULL) qu.EnQueue(p->rchild);
}
}
#endif
/*—————- http://ourys.com原创,做人要厚道,转帖请标明来处 ——- Author:Hector ——-*/
/*—————- 基本测试文件 ——-*/
#include
using namespace std;
#include “BiTree.h”
int main(void)
{
BiTree
my.CreateBiTree();
my.PreROrderTraverse();
cout<
cout<
cout<
cout<
cout<
PosOrderTraverse();
cout<
return 0;
}
[/CODE]