问题描述
用栈完成二叉树的非递归后序遍历
详细设计
#include<iostream>
#define initstacksize 100
using namespace std;
typedef struct bitnode
{
char data;
bitnode *lchild,*rchild;
} bitnode,*bitree;
class stack
{
bitree *base;
bitnode **top;
int stacksize;
public:
stack()
{
top=base=new bitree[initstacksize];
stacksize=initstacksize;
}
void push(bitnode *e)
{
*top++=e;
}
void pop(bitnode *&e)
{
if(top==base)
return;
e=*--top;
}
int stackempty()
{
if(top==base)
return 1;
else
return 0;
}
};
class bitt
{
bitnode *bt;
void create(bitnode *&t);
public:
void createbit();
void inorder();
void postorder();
};
void bitt::create(bitnode *&t)
{
char ch;
cin>>ch;
if(ch=='.')
t=NULL;
else
{
t=new bitnode;
t->data=ch;
create(t->lchild);
create(t->rchild);
}
}
void bitt::createbit()
{
bitnode *t;
create(t);
bt=t;
}
void bitt::inorder()
{
stack s;
bitnode *p=bt;
while(p||!s.stackempty())
if(p)
{
s.push(p);
cout<<p->data;
p=p->lchild;
}
else
{
s.pop(p);
//cout << p->data;//÷––Ú
p=p->rchild;
}
}
void bitt::postorder()
{
stack s1, s2;
bitnode *p = bt;
while(p || !s1.stackempty())
{
if(p)
{
s2.push(p);
s1.push(p);
p = p -> rchild;
}
else
{
s1.pop(p);
p = p -> lchild;
}
}
while(!s2.stackempty())
{
s2.pop(p);
cout<<p->data;
}
}
int main(void)
{
bitt t;
t.createbit();
t.inorder();
cout << endl;
t.postorder();
return 0;
}
基本思路
一直往右边走,并且存下路径上的节点,然后直到节点没有右子节点,开始往左边走,另外一个栈存下这些节点在另一个栈的进栈顺序