复习一下二叉树递归非递归的先中后序遍历
写非递归后序遍历的时候卡壳了,参考了一下网上的思路,大概有两种,一种是标记每个节点是否有走过,如果父节点的左右子节点都标记访问过,则可以访问父节点;一种是定义一个指针,指向上一个访问的节点,如果某父节点的右子节点为NULL或者是上一个访问的节点,则该父节点应当被访问。
#include<iostream>
#include<stdlib.h>
#include<stack>
#define size 20
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
//按先序遍历二叉树的创建
void create_BiTree(BiTree &exa){
char input_char;
cin>>input_char;
if(input_char=='#'){
exa=NULL;
return;
}
else{
exa=(BiTree)malloc(sizeof(BiTNode));
exa->data=input_char;
create_BiTree(exa->lchild);
create_BiTree(exa->rchild);
}
}
//递归方式先序遍历
void digui_preorder(BiTree exa){
if(exa==NULL)
return;
cout<<exa->data;
digui_preorder(exa->lchild);
digui_preorder(exa->rchild);
}
//递归方式中序遍历
void digui_inorder(BiTree exa){
if(exa==NULL)
return;
digui_inorder(exa->lchild);
cout<<exa->data;
digui_inorder(exa->rchild);
}
//非递归方式先序遍历
void feidigui_preorder(BiTree exa){
BiTree temp=exa;
stack<BiTree> BiTNode_stack;
while(temp||!BiTNode_stack.empty()){
if(temp!=NULL){
BiTNode_stack.push(temp);
cout<<temp->data;
temp=temp->lchild;
}
else{
temp=BiTNode_stack.top();
BiTNode_stack.pop();
temp=temp->rchild;
}
}
}
//非递归方式中序遍历
void feidigui_inorder(BiTree exa){
BiTree temp=exa;
stack<BiTree> BiTNode_stack;
while(temp||!BiTNode_stack.empty()){
if(temp!=NULL){
BiTNode_stack.push(temp);
temp=temp->lchild;
}
else{
temp=BiTNode_stack.top();
BiTNode_stack.pop();
cout<<temp->data;
temp=temp->rchild;
}
}
}
//非递归方式后序遍历
void feidigui_postorder(BiTree exa){
BiTree temp=exa, pointer=NULL;
stack<BiTree> BiTnode_stack;
while(temp!=NULL){
BiTnode_stack.push(temp);
temp=temp->lchild;
}
while(!BiTnode_stack.empty()){
temp=BiTnode_stack.top();
if(temp->rchild==NULL||temp->rchild==pointer){
cout<<temp->data;
BiTnode_stack.pop();
pointer=temp;
}
else{
temp=temp->rchild;
while(temp!=NULL){
BiTnode_stack.push(temp);
temp=temp->lchild;
}
}
}
}
int main(){
BiTree T;
create_BiTree(T);
digui_preorder(T);
cout<<endl;
digui_inorder(T);
cout<<endl;
feidigui_preorder(T);
cout<<endl;
feidigui_inorder(T);
cout<<endl;
feidigui_postorder(T);
return 0;
}