#include <stdio.h>
#include <stdlib.h>
#define maxn 1000
struct Tnode
{
int data;
struct Tnode* left;
struct Tnode* right;
};
typedef struct Tnode* Btree;
Btree creat()//µÝ¹é½¨Á¢¶þ²æÊ÷
{
int data;
scanf("%d",&data);
Btree root;
if(data!=-1)
{
root=(Btree)malloc(sizeof(struct Tnode));
root->data=data;
root->left=creat();
root->right=creat();
}
else
return NULL;
return root;
}
void preorder(Btree root)
{
Btree* zhan[maxn];
int top=-1;
if(root!=NULL)
{
zhan[++top]=root;
while(top!=-1)
{
Btree temp=zhan[top--];
printf("%d ",temp->data);
if(temp->right!=NULL)
{
zhan[++top]=temp->right;
}
if(temp->left!=NULL)
{
zhan[++top]=temp->left;
}
}
}
}
void inorder(Btree root)
{
Btree *zhan[maxn];
int top=-1;
Btree p=root;
if(root!=NULL)
{
while(p!=NULL||top!=-1)
{
while(p!=NULL) //从某一个结点起一直压栈知道它没有左孩子
{
zhan[++top]=p;
p=p->left;
}
if(top!=-1)//当上一结点不存在左孩子这个时候可以弹栈了
{
Btree temp=zhan[top--];
printf("%d ",temp->data);
if(temp->right!=NULL) //当弹栈的元素有右子树的时候要优先输出 因为以弹栈结点为整体的这个树理论上算是一个左树需要优先遍历
{
p=temp->right;
}
}
}
}
}
void postorder(Btree root)
{
Btree stack1[maxn];
int stack2[maxn];
int top1=-1,top2=-1;
if(root)
{
stack1[++top1]=root;
while(top1!=-1)
{
Btree temp=stack1[top1--];
stack2[++top2]=temp->data;
if(temp->left!=NULL)
{
stack1[++top1]=temp->left;
}
if(temp->right!=NULL)
{
stack1[++top1]=temp->right;
}
}
while(top2!=-1)
{
printf("%d ",stack2[top2--]);
}
}
}
int main()
{
Btree root=NULL;//
root=creat(); //1 2 4 -1 -1 5 6 7 -1 -1 -1 -1 3 -1 -1
preorder(root);
printf("\n");
inorder(root);
printf("\n");
postorder(root);
return 0;
}
二叉树的非递归前中后遍历
猜你喜欢
转载自blog.csdn.net/qq_40795475/article/details/89644781
今日推荐
周排行