C++语言实现二叉树的非递归遍历
来源:互联网 发布:淘宝店店招是什么意思 编辑:程序博客网 时间:2024/06/07 00:43
#include<iostream>
#include<stack>
using namespace std;
typedef struct BiTNode
{
int data;
BiTNode *lchild,*rchild;
}BiTNode;
BiTNode* goLeft(BiTNode* T,stack<BiTNode*> &s)
{
if(T == NULL)
{
return NULL;
}
//如果有左子树 入栈 返回起点
while(T->lchild)
{
s.push(T);
T = T->lchild;
}
return T;
}
void inOrder01(BiTNode* T)
{
BiTNode* t = NULL;
stack<BiTNode*> s;
if(T == NULL)
{
return;
}
//步骤1 找到左起点
t = goLeft(T,s);
while(t)
{
printf("%d ",t->data);
//如果有右子树 重复步骤1
if(t->rchild)
{
t = goLeft(t->rchild,s);
}
else if(!s.empty())
{
t = s.top();
s.pop();
}
else
{
t = NULL;
}
}
}
void preOrder01(BiTNode* T)
{
stack<BiTNode*> s;
BiTNode* t = NULL;
if(T == NULL)
{
return;
}
t = T;
while(t)
{
printf("%d ",t->data);
if(t->lchild)
{
if(t->rchild)
{
s.push(t->rchild);
}
t = t->lchild;
}
else if(t->rchild)
{
t = t->rchild;
}
else if(!s.empty())
{
t = s.top();
s.pop();
}
else
{
t = NULL;
}
}
}
void goLeft1(BiTNode* T,stack<BiTNode*> &s)
{
BiTNode* t = NULL;
if(T == NULL)
{
return;
}
while(T)
{
s.push(T);
t = T;
T = T->lchild;
if(T == NULL)
{
T = t->rchild;
}
}
}
void postOrder01(BiTNode* T)
{
stack<BiTNode*> s;
BiTNode* t = NULL;
BiTNode* tmp = NULL;
if(T == NULL)
{
return;
}
goLeft1(T,s);
if(!s.empty())
{
t = s.top();
}
while(t)
{
if(!t->rchild || t->rchild == tmp)
{
printf("%d ", t->data);
tmp = t;
s.pop();
//t = s.top();
if(!s.empty())
{
t = s.top();
}
else
{
t = NULL;
}
}
else
{
goLeft1(t->rchild,s);
if(!s.empty())
{
t = s.top();
}
else
{
t = NULL;
}
}
}
}
void main()
{
BiTNode t1,t2,t3,t4,t5; //定义树的节点
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立节点之间的关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
printf("非递归前序遍历\n");
preOrder01(&t1);
printf("\n");
printf("非递归中序遍历:\n");
inOrder01(&t1);
printf("\n");
printf("非递归后序遍历:\n");
postOrder01(&t1);
printf("\n");
{
BiTNode t1,t2,t3,t4,t5,t6; //定义树的节点
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
memset(&t6,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
t6.data = 6;
t1.lchild = &t2;
t2.lchild = &t3;
t2.rchild = &t4;
t1.rchild = &t5;
t5.rchild = &t6;
printf("非递归前序遍历\n");
preOrder01(&t1);
printf("\n");
printf("非递归中序遍历:\n");
inOrder01(&t1);
printf("\n");
printf("非递归后序遍历:\n");
postOrder01(&t1);
printf("\n");
}
printf("hello...\n");
system("pause");
return;
}
#include<stack>
using namespace std;
typedef struct BiTNode
{
int data;
BiTNode *lchild,*rchild;
}BiTNode;
BiTNode* goLeft(BiTNode* T,stack<BiTNode*> &s)
{
if(T == NULL)
{
return NULL;
}
//如果有左子树 入栈 返回起点
while(T->lchild)
{
s.push(T);
T = T->lchild;
}
return T;
}
void inOrder01(BiTNode* T)
{
BiTNode* t = NULL;
stack<BiTNode*> s;
if(T == NULL)
{
return;
}
//步骤1 找到左起点
t = goLeft(T,s);
while(t)
{
printf("%d ",t->data);
//如果有右子树 重复步骤1
if(t->rchild)
{
t = goLeft(t->rchild,s);
}
else if(!s.empty())
{
t = s.top();
s.pop();
}
else
{
t = NULL;
}
}
}
void preOrder01(BiTNode* T)
{
stack<BiTNode*> s;
BiTNode* t = NULL;
if(T == NULL)
{
return;
}
t = T;
while(t)
{
printf("%d ",t->data);
if(t->lchild)
{
if(t->rchild)
{
s.push(t->rchild);
}
t = t->lchild;
}
else if(t->rchild)
{
t = t->rchild;
}
else if(!s.empty())
{
t = s.top();
s.pop();
}
else
{
t = NULL;
}
}
}
void goLeft1(BiTNode* T,stack<BiTNode*> &s)
{
BiTNode* t = NULL;
if(T == NULL)
{
return;
}
while(T)
{
s.push(T);
t = T;
T = T->lchild;
if(T == NULL)
{
T = t->rchild;
}
}
}
void postOrder01(BiTNode* T)
{
stack<BiTNode*> s;
BiTNode* t = NULL;
BiTNode* tmp = NULL;
if(T == NULL)
{
return;
}
goLeft1(T,s);
if(!s.empty())
{
t = s.top();
}
while(t)
{
if(!t->rchild || t->rchild == tmp)
{
printf("%d ", t->data);
tmp = t;
s.pop();
//t = s.top();
if(!s.empty())
{
t = s.top();
}
else
{
t = NULL;
}
}
else
{
goLeft1(t->rchild,s);
if(!s.empty())
{
t = s.top();
}
else
{
t = NULL;
}
}
}
}
void main()
{
BiTNode t1,t2,t3,t4,t5; //定义树的节点
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
//建立节点之间的关系
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
printf("非递归前序遍历\n");
preOrder01(&t1);
printf("\n");
printf("非递归中序遍历:\n");
inOrder01(&t1);
printf("\n");
printf("非递归后序遍历:\n");
postOrder01(&t1);
printf("\n");
{
BiTNode t1,t2,t3,t4,t5,t6; //定义树的节点
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
memset(&t6,0,sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
t6.data = 6;
t1.lchild = &t2;
t2.lchild = &t3;
t2.rchild = &t4;
t1.rchild = &t5;
t5.rchild = &t6;
printf("非递归前序遍历\n");
preOrder01(&t1);
printf("\n");
printf("非递归中序遍历:\n");
inOrder01(&t1);
printf("\n");
printf("非递归后序遍历:\n");
postOrder01(&t1);
printf("\n");
}
printf("hello...\n");
system("pause");
return;
}
0 0
- 二叉树遍历的c语言非递归实现
- 二叉树的非递归遍历C语言实现
- C语言实现二叉树的递归遍历与非递归遍历
- C语言实现二叉树的递归遍历和非递归遍历
- C语言实现二叉树的递归遍历与非递归遍历
- C语言二叉树的遍历,递归和非递归
- C语言实现二叉树的常用的算法(递归与非递归实现遍历)
- 二叉树非递归遍历C语言实现
- 二叉树非递归遍历C语言实现
- 遍历二叉树的递归算法与非递归算法以及C语言实现
- <数据结构>二叉树的递归、非递归以及层次遍历算法C语言实现
- 二叉树遍历的递归和非递归实现(C语言)
- 二叉树的遍历(c语言非递归算法)
- C++语言实现二叉树的非递归遍历
- c语言实现顺序二叉树的非递归的三种遍历算法
- c语言原生实现二叉树的 非递归 中序 先序 后序 遍历
- stack 实现二叉树的非递归遍历——C语言
- 二叉树的非递归遍历C实现
- 欢迎使用CSDN-markdown编辑器
- 初识Redis(一)
- 什么是Linux挂载 关于挂载的详细说明
- Mysql高可用架构设计
- 23种设计模式(6):模版方法模式
- C++语言实现二叉树的非递归遍历
- Spring学习笔记 Spring项目介绍
- angular三种tab选项卡的实现
- 历届试题 买不到的数目
- (26进制大数相加)hdu 2100 Lovekey
- 友盟多渠道打包
- 设计模式之适配器模式
- 【遇见大咖】测试界:你的年终奖有多少?
- nodeValue、value和innerHTML的区别