二叉树的三种非递归遍历
2016-08-09 11:12
218 查看
二叉树有三种遍历方法,分别是前序遍历,中序遍历和后序遍历,下面分享下前两种方法的非递归形式。
由于二叉树的这三种遍历过程非常适合堆栈的结构特点,即"先进后出",所以采用堆栈的结构。在沿左子树深入时,进入一个结点就将其压入堆栈。若是先序遍历,则在入栈之前访问之;当沿左分支深入不下去时,则返回,即从堆栈里弹出前面压入的结点;若为中序遍历,则此时访问该结点,然后从该结点的右子树继续深入;
树与堆栈结构如下:(我采用的是顺序栈)
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
前序遍历:
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
中序遍历:
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
现在给定一颗二叉树,采用给出前序遍历和中序遍历的方法建立二叉树,然后按前序和中序的方法遍历二叉树,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXN 50
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
BinTree CreateTree(char Pre[], char In[], int Len)
{
BinTree T;
int i;
if(!Len)
return NULL;
T = malloc(sizeof(struct TreeNode));
T->Data = Pre[0];
for(i = 0; i < Len; i++)
if(In[i] == Pre[0])
break;
T->Left = CreateTree(Pre+1, In, i);
T->Right = CreateTree(Pre+i+1, In+i+1, Len-i-1);
return T;
}
void Push(BinTree item, Stack p)
{
if(p->Top == MAXN-1)
{
printf("The stack is full\n");
return ;
}
else{
p->Data[++(p->Top)] = item;
return;
}
}
BinTree Pop(Stack p)
{
if(p->Top == -1)
{
printf("The stack is empty\n");
return NULL;
}
else
return (p->Data[(p->Top)--]);
}
int IsEmpty(Stack S)
{
if(S->Top == -1)
return 1;
else
return 0;
}
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
int main()
{
BinTree BT;
char Pre[MAXN], In[MAXN];
int n;
scanf("%d", &n);
scanf("%s%s", Pre, In);
BT = CreateTree(Pre, In, n);
InOrderTravel(BT);
printf("\n");
PreOrderTravel(BT);
return 0;
}
由于二叉树的这三种遍历过程非常适合堆栈的结构特点,即"先进后出",所以采用堆栈的结构。在沿左子树深入时,进入一个结点就将其压入堆栈。若是先序遍历,则在入栈之前访问之;当沿左分支深入不下去时,则返回,即从堆栈里弹出前面压入的结点;若为中序遍历,则此时访问该结点,然后从该结点的右子树继续深入;
树与堆栈结构如下:(我采用的是顺序栈)
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
前序遍历:
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
中序遍历:
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
现在给定一颗二叉树,采用给出前序遍历和中序遍历的方法建立二叉树,然后按前序和中序的方法遍历二叉树,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXN 50
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
typedef struct StackNode *Stack;
struct StackNode{
BinTree Data[MAXN];
int Top;
};
BinTree CreateTree(char Pre[], char In[], int Len)
{
BinTree T;
int i;
if(!Len)
return NULL;
T = malloc(sizeof(struct TreeNode));
T->Data = Pre[0];
for(i = 0; i < Len; i++)
if(In[i] == Pre[0])
break;
T->Left = CreateTree(Pre+1, In, i);
T->Right = CreateTree(Pre+i+1, In+i+1, Len-i-1);
return T;
}
void Push(BinTree item, Stack p)
{
if(p->Top == MAXN-1)
{
printf("The stack is full\n");
return ;
}
else{
p->Data[++(p->Top)] = item;
return;
}
}
BinTree Pop(Stack p)
{
if(p->Top == -1)
{
printf("The stack is empty\n");
return NULL;
}
else
return (p->Data[(p->Top)--]);
}
int IsEmpty(Stack S)
{
if(S->Top == -1)
return 1;
else
return 0;
}
void InOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
Push(T,S);
T = T->Left;
}
T = Pop(S);
printf("%c ", T->Data);
T = T->Right;
}
}
void PreOrderTravel(BinTree BT)
{
BinTree T;
Stack S = malloc(sizeof(struct StackNode));
S->Top = -1;
T = BT;
while(T || !IsEmpty(S)){
while(T){
printf("%c ", T->Data);
Push(T,S);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
}
int main()
{
BinTree BT;
char Pre[MAXN], In[MAXN];
int n;
scanf("%d", &n);
scanf("%s%s", Pre, In);
BT = CreateTree(Pre, In, n);
InOrderTravel(BT);
printf("\n");
PreOrderTravel(BT);
return 0;
}
相关文章推荐
- 二叉树的递归和非递归方式的三种遍历
- 二叉树的三种遍历方式的递归实现和非递归实现
- java实现二叉树的三种遍历算法(递归)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树(二):三种遍历的非递归实现
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- Java三种遍历方式打印二叉树(递归实现)
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 二叉树三种遍历非递归实现【每日一题】
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树的三种遍历方式的循环和递归的实现方式
- 二叉树的三种遍历方法(递归和非递归)(转载)
- java实现二叉树的三种遍历算法(递归)
- 二叉树的三种遍历方式的递归与非递归实现
- 二叉树的三种遍历方法(递归和非递归)
- 二叉树的三种遍历的非递归实现
- 二叉树的三种遍历(递归+非递归)
- 数据结构(二叉树系列)先序创建三种遍历和求深度(递归实现)
- 二叉树三种遍历算法的递归和非递归实现(C++)
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)