费了两天时间写的,包括前中后序遍历的递归和非递归算法,还有层序遍历总共2*3 + 1 = 7中遍历二叉树的算法,感觉其中后序遍历的非递归算法比较困难,想了很久最后的实现还是不够优雅,请大家指正~~
总共三个文件,一个头文件,一个对应的cpp文件,还有一个用于测试的文件.
头文件:
/********************************************************************
created:2006/07/04
filename:BinaryTree.h
author:李创
http://www.cppblog.com/converse/
purpose:演示二叉树的算法
*********************************************************************/#ifndefBinaryTree_H
#defineBinaryTree_H
#include<stdlib.h>
#include<stack>
classBinaryTree
{
private:
typedefintItem;
typedefstructTreeNode
{
ItemNode;
TreeNode*pRight;
TreeNode*pLeft;
TreeNode(Itemnode=0,TreeNode*pright=NULL,TreeNode*pleft=NULL)
:Node(node)
,pRight(pright)
,pLeft(pleft)
{
}
}TreeNode,*PTreeNode;
public:
enumTraverseType
{
PREORDER=0,//前序
INORDER=1,//中序
POSTORDER=2,//后序
LEVELORDER=3//层序
};
BinaryTree(ItemArray[],intnLength);
~BinaryTree();
PTreeNodeGetRoot()
{
returnm_pRoot;
}
//遍历树的对外接口
//指定遍历类型和是否是非递归遍历,默认是递归遍历
voidTraverse(TraverseTypetraversetype,boolbRec=true);
private:
PTreeNodeCreateTreeImpl(ItemArray[],intnLength);
voidDetroyTreeImpl(PTreeNodepTreenode);
voidPreTraverseImpl(PTreeNodepTreenode);//递归前序遍历树
voidInTraverseImpl(PTreeNodepTreenode);//递归中序遍历树
voidPostTraverseImpl(PTreeNodepTreenode);//递归后序遍历树
voidNoRecPreTraverseImpl(PTreeNodepTreenode);//非递归前序遍历树
voidNoRecInTraverseImpl(PTreeNodepTreenode);//非递归中序遍历树
voidNoRecPostTraverseImpl(PTreeNodepTreenode);//非递归后序遍历树
voidLevelTraverseImpl(PTreeNodepTreenode);
PTreeNodem_pRoot;//根结点
//采用STL里面的stack作为模拟保存链表结点的stack容器
typedefstd::stack<BinaryTree::PTreeNode>TreeNodeStack;
};
#endif
实现文件:
测试文件:
/********************************************************************
created:2006/07/04
filename:main.cpp
author:李创
http://www.cppblog.com/converse/
purpose:测试二叉树的算法
*********************************************************************/#include"BinaryTree.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
voidDisplayArray(
intarray[],
intlength)
{
inti;
for(i=0;i<length;i++)
{
printf("array[%d]=%d\n",i,array[i]);
}
}voidCreateNewArray(
intarray[],
intlength)
{
for(inti=0;i<length;i++)
{
array[i]=rand()%256+i;
}
}intmain()
{
intarray[10];
srand(time(NULL));
//创建数组
CreateNewArray(array,10);
DisplayArray(array,10);
BinaryTree*pTree=newBinaryTree(array,10);
//测试前序遍历
pTree->Traverse(BinaryTree::PREORDER);
std::cout<<"root="<<pTree->GetRoot()->Node<<std::endl;
std::cout<<"root->left="<<pTree->GetRoot()->pLeft->Node<<std::endl;
std::cout<<"root->right="<<pTree->GetRoot()->pRight->Node<<std::endl;
pTree->Traverse(BinaryTree::PREORDER,false);
//测试中序遍历
pTree->Traverse(BinaryTree::INORDER);
std::cout<<"root="<<pTree->GetRoot()->Node<<std::endl;
std::cout<<"root->left="<<pTree->GetRoot()->pLeft->Node<<std::endl;
std::cout<<"root->right="<<pTree->GetRoot()->pRight->Node<<std::endl;
pTree->Traverse(BinaryTree::INORDER,false);
//测试后序遍历
pTree->Traverse(BinaryTree::POSTORDER);
std::cout<<"root="<<pTree->GetRoot()->Node<<std::endl;
std::cout<<"root->left="<<pTree->GetRoot()->pLeft->Node<<std::endl;
std::cout<<"root->right="<<pTree->GetRoot()->pRight->Node<<std::endl;
pTree->Traverse(BinaryTree::POSTORDER,false);
//测试层序遍历
pTree->Traverse(BinaryTree::LEVELORDER);
system("pause");
deletepTree;
return0;
}
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
二叉树先序、中序、后序遍历非递归算法,简述了二叉树的基本算法。
关于二叉树前序和后序的非递归遍历算法.rar
数据结构中关于二叉树的遍历,非递归算法数上未给出
数据结构二叉树链式结构的前序遍历,中序遍历,后序遍历用递归的方法,层级遍历采用队列结构
这是数据结构中二叉树的后序遍历的非递归算法的源代码。
二叉树先序、中序、后序三种遍历的非递归算法
20二叉树的中序、前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树的实现。(2 人) 要求: 树与二叉树的转换的实现。以及树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历...
二叉树遍历的算法,包括先序后序中序的递归算法
二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法,不得不下的资源
自己编写的实验二叉树的后序遍历非递归算法 包括以递归中序遍历建立二叉树 前序,中序,后序递归以及非递归实现二叉树的遍历 经vc6.0编译通过 自己实验,不足之处应该很多,望指出
通过本次实习加强了对二叉树的建立和各种遍历...它们分别完成了二叉树的建立,以及递归、非递归的先序遍历、中序遍历、后序遍历和层序遍历算法:其中先序中序后序的递归遍历算法是利用二叉树的链式存储结构进行的遍历。
二叉树先序、中序、后序遍历(递归、非递归算法) 其中自己已经开发了栈!
二叉树前序、中序、后序三种遍历的非递归算法(C语言)
经典的数据结构问题:二叉树非递归遍历算法实现 二叉树递归遍历算法实现
二叉树遍历算法 (递归的、非递归的中序、前序、后序遍历 和 层次遍历 以及 求二叉树的宽度和深度)
本程序采用非递归方法实现对二叉树的先序、中序、后序遍历.自定义栈和树的结构。
栈的应用——二叉树的前序、中序、后序非递归遍历算法
按先序扩展序列建立二叉树,先序、中序、后序遍历的递归算法,二叉树遍历的非递归算法,层次的非递归算法,求二叉树的深度。