二叉树的结构
前序遍历:
while(p!=NULL||!s.empty()){
while(p!=NULL){
cout<<p->data<<endl;
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
p=p->rchild;
}
}
中序遍历
while(p!=NULL||!s.empty()){
while(p!=NULL){
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
cout<<p->data<<endl;
s.pop();
p=p->rchild;
}
}
后序遍历
后序遍历的思路:
保证根节点的左节点和右节点访问之后才能访问根节点,因此对于任意一个节点BTNode我们先将其入栈,存在两种情况;
1)BTNode的左节点和右节点都为空,可以直接访问;
2)BTNode存在左节点或者右节点,但是左节点和右节点都已经被访问过了,也可以直接访问该节点。
s.push(root);
BinTree* pre=NULL;
while(!s.empty()){
cur=s.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild){
cout<<p->data<<endl;
s.pop();
pre=cur;
}else{
if(cur->rchild!=NULL){
s.push(cur->rchild);
}
if(cur->lchild!=NULL){
s.push(cur->lchild);
}
}
}