二叉树的创建和先序,中序,后序,递归,非递归遍历
来源:互联网 发布:js涂膜防水套什么定额 编辑:程序博客网 时间:2024/04/29 21:11
#include "stdafx.h"
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
#define SMAXSIZE 100
//二叉树的创建
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//存储二叉树的栈
BiTree CreateBiTree()
{
char e;
BiTree T;
cin>>e;
if(e=='#') T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=e;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return T;
}
//前序递归遍历
void PreOrder(BiTree T)
{
if(T!=NULL)
{
cout<<T->data <<" ";
PreOrder(T->lchild );
PreOrder(T->rchild );
}
}
//中序递归遍历
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->lchild );
cout<<T->data <<" ";
InOrder(T->rchild );
}
}
//后序递归遍历
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild );
PostOrder(T->rchild );
cout<<T->data <<" ";
}
}
//前序非递归遍历
void Pre_Order(BiTree T)
{
BiTree stack[SMAXSIZE],p;
int top;
if(T!=NULL)
{
top=1;
stack[top]=T;
while(top>0)
{
p=stack[top--];
cout<<p->data<<" ";
if(p->rchild!=NULL)
stack[++top]=p->rchild;
if(p->lchild!=NULL)
stack[++top]=p->lchild;
}
}
}
//中序非递归遍历
void In_Order(BiTree T)
{
BiTree stack[SMAXSIZE],p;
p=T;
int top =0;
while(p!=NULL||top>0)
{
if(p!=NULL)
{
stack[++top]=p;
p=p->lchild ;
}
else{
p=stack[top--];
cout<<p->data<<" " ;
p=p->rchild ;
}
}
}
//后序非递归遍历
void Post_Order(BiTree T)
{
typedef struct
{
BiTree ptr;
int tag;
}Snode;
Snode stack[SMAXSIZE] ,s;
int top=0;
BiTree p=T;
while(p!=NULL||top>0)
{
if(p!=NULL)
{
s.ptr=p;
s.tag=1;
stack[++top]=s;
p=p->lchild ;//继续遍历左子树
}
else {
s=stack[top--];//当p=NULL且top>0是,则做出栈操作
p=s.ptr;
if(s.tag==1)
{
//第二次入栈tag标记为2
s.tag=2;
stack[++top]=s;
p=p->rchild ; //继续遍历右子树
}
else {
cout<<p->data ;
p=NULL;
}
}
}
}
void main()
{
BiTree T;
printf("创建二叉树:\n");
printf("**********************************************************\n");
printf("请按顺序输入二叉树的元素: \n");
T=CreateBiTree();
//下面是二叉树的递归遍历
cout<<"下面是遍历二叉树"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"\n下面是先序递归遍历:"<<endl;
PreOrder(T);
cout<<"\n下面是中序递归遍历:"<<endl;
InOrder(T);
cout<<"\n下面是后序递归遍历:"<<endl;
PostOrder(T);
cout<<"递归遍历完毕"<<endl;
cout<<"\n下面是非递归遍历:"<<endl;
cout<<"**********************************************************"<<endl;
cout<<"下面是先序非递归遍历"<<endl;
Pre_Order(T);
cout<<"\n下面是中序非递归遍历"<<endl;
In_Order(T);
cout<<"\n\n全部遍历结束!"<<endl;
}
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- 二叉树的先序、中序、后序递归遍历和非递归遍历
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的创建 先序 中序 后续 递归和非递归遍历
- 二叉树创建、删除、(递归/非递归)先序(中序/后序)遍历
- 二叉树非递归和递归遍历(先序,中序,后序)
- 二叉树 先、中、后序递归和非递归遍历
- 二叉树的先序,中序和后序遍历的非递归算法
- 二叉树的递归创建,先序(中序、后序)递归遍历二叉树
- 二叉树的非递归先序、中序和后序遍历
- 二叉树的先序、中序、后序、层序递归及非递归遍历
- 二叉树的先序/中序/后序(递归、非递归)+层序遍历
- 二叉树的遍历 中序 后序 先序 递归 非递归
- 二叉树的遍历 先序 中序 后序 递归非递归
- 二叉树的先序、中序、后序遍历(递归 and 非递归)
- 递归和非递归的方式实现二叉树的先序、中序和后序遍历
- 二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方法
- MySQL常用命令与基本命令操作
- java解决迷宫问题(鲍志强)
- 插补搜寻法之算法分析及实现
- InetAddress 类使用说明
- 利用URL类和JEditorPane类编写一个非常更简单的浏览器
- 二叉树的创建和先序,中序,后序,递归,非递归遍历
- java socket 简释
- 移动WebApp开发 JS框架对比
- 插入排序代码示例
- vs2008 + OpenCV-2.1.0-win32-vs2008安装
- C、C++指向函数的指针(函数指针)浅析
- c++的三种继承方式
- my SQL 命令大全
- MySQL学习笔记04-MySQL的启动和连接