二叉树的三种非递归遍历
来源:互联网 发布:windows errorcode 2 编辑:程序博客网 时间:2024/06/08 18:06
二叉树有三种遍历方法,分别是前序遍历,中序遍历和后序遍历,下面分享下前两种方法的非递归形式。
由于二叉树的这三种遍历过程非常适合堆栈的结构特点,即"先进后出",所以采用堆栈的结构。在沿左子树深入时,进入一个结点就将其压入堆栈。若是先序遍历,则在入栈之前访问之;当沿左分支深入不下去时,则返回,即从堆栈里弹出前面压入的结点;若为中序遍历,则此时访问该结点,然后从该结点的右子树继续深入;
树与堆栈结构如下:(我采用的是顺序栈)
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;
}
- 二叉树的三种非递归遍历方式。
- 二叉树的三种非递归遍历
- 二叉树的三种非递归遍历
- 二叉树的三种非递归遍历算法
- 二叉树的三种非递归遍历
- 二叉树的三种非递归遍历
- 二叉树的三种非递归遍历
- 二叉树的三种非递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- 二叉树的递归遍历
- IMX6的相关音频结构体的定义
- 经纬度距离换算
- Java的动态代理机制和Spring的实现方式
- JsonObject JsonArray
- 七种回归分析
- 二叉树的三种非递归遍历
- 如何确定Linux系统版本
- 高并发、大流量网卡调优
- BlockChain技术系列(三)- fabric协议介绍
- linux中sed的用法
- POJ 3436 ACM Computer Factory 最大流输出路径
- C#控制台基础 使用while的优秀格式
- Spring的事务管理难点剖析:应用分层的迷惑
- qwt编程使用(二)