关于二叉树的递归与非递归遍历代码(主要是非递归后序)

前面的递归没有问题,后面的非递归的前序和中序也没有问题。
就是非递归的后序代码出错了。
请大神们帮忙看看哪地方错了?
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef char datatype;
typedef struct node{
datatype data;
struct node *lchild,*rchild;
}Tnode,*BTree;
BTree CreateBinTree()
{
BTree t;
char ch;
ch=getchar();
if(ch=='#') t=NULL;
else
{
t=(Tnode*)malloc(sizeof(Tnode));
t->data=ch;
t->lchild=CreateBinTree();
t->rchild=CreateBinTree();
}
return t;
}

void PreOrder(BTree t)
{
if(t)
{
printf("%c",t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
void InOrder(BTree t)
{
if(t)
{
InOrder(t->lchild);
printf("%c",t->data);
InOrder(t->rchild);
}
}
void PostOrder(BTree t)
{
if(t)
{
PostOrder(t->lchild);
PostOrder(t->rchild);
printf("%c",t->data);

}
}

void PreOrder1(BTree t)
{
BTree s[maxsize];
int top=-1;
BTree p=t;
while(p||top!=-1)
{
while(p)
{
printf("%c",p->data);
top++;
s[top]=p;
p=p->lchild;
}
p=s[top];
top--;
p=p->rchild;
}
}
void InOrder1(BTree t)
{
BTree s[maxsize];
int top=-1;
BTree p=t;
while(p||top!=-1)
{
while(p)
{
top++;
s[top]=p;
p=p->lchild;
}
p=s[top];
printf("%c",p->data);
top--;
p=p->rchild;
}
}
void PostOrder1(BTree t)
{
BTree s1[maxsize];
BTree s2[maxsize];
int top=-1;
BTree p=t;
while(p||!s2)
{
while(p)
{
top++;
s1[top]=p;
s2[top]=p;
p=p->rchild;
}
p=s2[top];
top--;
p=p->lchild;
}
while(!s1)
{
p=s1[top];
printf("%c\n",p->data);
}
}

void main()
{
BTree t;
t=CreateBinTree();
PostOrder1(t);

}

二叉树的遍历是指按照一定次序访问二叉树中的所有节点,且每个节点仅被访问一次的过程。是最基本的运算,是其他运算的基础。二叉树有两种存储结构:顺序存储和链式存储顺序存储:(对完全二叉树来说,可以充分利用存储空间,但对于一般的二叉树,只有少数的存储单元被利用)[cpp]viewplaincopytypedefstruct{ElemTypedata[MaxSize];intn;}SqBTree;链式存储:[csharp]viewplaincopytypedefstructnode{ElemTypedata;structnode*lchild;structnode*rchild;}BTNode;二叉树三种递归的遍历方法:先序遍历访问根节点→先序遍历左子树→先序遍历右子树中序遍历中序遍历左子树→访问根节点→中序遍历右子树后序遍历后序遍历左子树→后序遍历右子树→访问根节点二叉树遍历的递归算法:[cpp]viewplaincopyvoidpreOrder(BTNode*b)//先序遍历递归算法{if(b!=NULL){visit(b);preOrder(b->lchild);preOrder(b->rchild);}}voidInOrder(BTNode*b)//中序遍历递归算法{if(b!=NULL){InOrder(b->lchild);visit(b);InOrder(b->rchild);}}voidPostOrder(BTNode*b)//后序遍历递归算法{if(b!=NULL){PostOrder(b->lchild);PostOrder(b->rchild);visit(b);}}二叉树非递归遍历算法:有两种方法:①用栈存储信息的方法②增加指向父节点的指针的方法暂时只介绍下栈的方法先序遍历:[cpp]viewplaincopyvoidPreOrder(BTNode*b){Stacks;while(b!=NULL||!s.empty()){if(b!=NULL){visit(b);s.push(b);b=b->left;}else{b=s.pop();b=b->right;}}}中序遍历:[cpp]viewplaincopyvoidInOrder(BTNode*b){Stacks;while(b!=NULL||!s.empty()){if(b!=NULL){s.push(b);s=s->left}if(!s.empty()){b=s.pop();visit(b);b=b->right;}}}后序遍历:[cpp]viewplaincopyvoidPostOrder(BTNode*b){Stacks;while(b!=NULL){s.push(b);}while(!s.empty()){BTNode*node=s.pop();if(node->bPushed){visit(node);}else{s.push(node);if(node->right!=NULL){node->right->bPushed=false;s.push(node->right);}if(node->left!=NULL){node->left->bpushed=false;s.push(node->left);}node->bPushed=true;//如果标识位为true,则表示入栈}}}层次遍历算法:(用队列的方法)[cpp]viewplaincopyvoidlevelOrder(BTNode*b){QueueQ;Q.push(b);while(!Q.empty()){node=Q.front();visit(node);if(NULL!=node->left){Q.push(node->left);}if(NULL!=right){Q.push(node->right);}}}已知先序和中序求后序的算法:(已知后序和中序求先序的算法类似,但已知先序和后序无法求出中序)[cpp]viewplaincopyintfind(charc,charA[],ints,inte)/*找出中序中根的位置。*/{inti;for(i=s;iin_e)return;/*非法子树,完成。*/if(in_s==in_e){printf("%c",in[in_s]);/*子树子仅为一个节点时直接输出并完成。*/return;}c=pre[pre_s];/*c储存根节点。*/k=find(c,in,in_s,in_e);/*在中序中找出根节点的位置。*/pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1);/*递归求解分割的左子树。*/pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e);/*递归求解分割的右子树。*/printf("%c",c);/*根节点输出。*/}main(){charpre[]="abdc";charin[]="bdac";printf("Theresult:");pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);getch();}
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答