二叉树
非递归遍历原理
- 在前序遍历中
- 遇到结点就打印,在讲结点放进堆栈
- 当结点为空,将结点弹出堆栈在访问结点的右子树
- 再循环步骤
中序遍历
- 中序遍历中
- 遇到结点先保存在堆栈里面
- 当结点空的时候 我们将堆栈抛出结点 在打印结点 在访问结点的右子树
- 循环
创建一颗二叉树
代码
#include<stdio.h>
#include<stdlib.h>
typedef char ElmentType;
typedef struct Tnode{
struct Tnode *Left;
struct Tnode *Right;
ElmentType data;
}Tnode;
typedef Tnode* Tree;
Tree CreateTree() ;
void Preoreder(Tree T);
void Inoreder(Tree T);
void Backoreder(Tree T);
void FInOrderTraverse(Tree BT);
void FPreOrderTraverse(Tree BT) ;
int main()
{
Tree T = CreateTree();
Preoreder(T);
printf("\n");
FPreOrderTraverse(T);
return 0;
}
Tree CreateTree() //返回根结点的地址
{
Tree root = NULL;
char ch;
scanf("%c",&ch); //
if( ch!= '#')
{
root = (Tree)malloc(sizeof(Tnode));
root->data = ch;
root->Left = CreateTree();
root->Right = CreateTree();
}else{
root = NULL;
}
return root; //返回根节点
}
void Preoreder(Tree T)
{
if(T!=NULL)
{
printf("%c",T->data);
Preoreder(T->Left);
Preoreder(T->Right);
}else{
return ;
}
}
void Inoreder(Tree T)
{
if(T!=NULL)
{
Inoreder(T->Left);
printf("%c",T->data);
Inoreder(T->Right);
}else{
return ;
}
}
void Backoreder(Tree T)
{
if(T!=NULL)
{
Backoreder(T->Left);
Backoreder(T->Right);
printf("%c",T->data);
}else{
return ;
}
}
void FInOrderTraverse(Tree BT) //先序遍历二叉树
{
Tnode* stk[2000];
Tnode* node = BT;
int stk_top = 0;
while( stk_top > 0 || node!= NULL)
{
while( node!=NULL)
{
stk[stk_top++] = node ;//将结点地址P Push Stack S
node = node->Left; //
}
if(node == NULL)
{
node = stk[--stk_top]; //结点弹出堆栈
printf("%5c",node->data);//访问打印结点
node = node->Right;
}
}
}
void FPreOrderTraverse(Tree BT) //先序遍历二叉树
{
Tnode* stk[2000];
Tnode* node = BT;
int stk_top = 0;
while( stk_top > 0 || node!= NULL)
{
while( node!=NULL)
{
stk[stk_top++] = node ;//将结点地址P Push Stack S
printf("%5c",node->data);//访问打印结点
node = node->Left; //
}
if(node == NULL)
{
node = stk[--stk_top]; //结点弹出堆栈
node = node->Right;
}
}
}
非递归先序代码实现
void FPreOrderTraverse(Tree BT) //先序遍历二叉树
{
Tnode* stk[2000];
Tnode* node = BT;
int stk_top = 0;
while( stk_top > 0 || node!= NULL)
{
while( node!=NULL)
{
stk[stk_top++] = node ;//将结点地址P Push Stack S
printf("%5c",node->data);//访问打印结点
node = node->Left; //
}
if(node == NULL)
{
node = stk[--stk_top]; //结点弹出堆栈
node = node->Right;
}
}
}
非递归代码中序
void FInOrderTraverse(Tree BT) //先序遍历二叉树
{
Tnode* stk[2000];
Tnode* node = BT;
int stk_top = 0;
while( stk_top > 0 || node!= NULL)
{
while( node!=NULL)
{
stk[stk_top++] = node ;//将结点地址P Push Stack S
node = node->Left; //
}
if(node == NULL)
{
node = stk[--stk_top]; //结点弹出堆栈
printf("%5c",node->data);//访问打印结点
node = node->Right;
}
}
}
非递归后序代码
待完成