二叉树遍历路径
![](https://i-blog.csdnimg.cn/blog_migrate/8d5a400999906981bbf7a835ab7e215a.png)
×代表第一次访问,也就是前序遍历
五角星代表第二次访问,就是中序遍历
三角形代表第三次访问,就是后序遍历
所以我们只要把结点放入 栈 中,控制结点出栈(输出)的时间即可。
C++代码
代码中包含二叉树的创建:二叉树的创建
中序遍历和先序遍历相似,把中序的输出语句提前就是先序遍历。
#include <iostream>
#include <stack>
#include <malloc.h>
using namespace std;
typedef char DataType;
typedef struct Node *BinTree;
typedef struct Node BinTNode;
struct Node{
DataType data;
BinTree Left,Right;
};
//创建二叉树
void creat_BinTree(BinTree *BT){
char ch;
scanf("%c",&ch);
if(ch=='#'){
*BT=NULL;
}else{
//创建根结点
*BT=(BinTNode*)malloc(sizeof(BinTNode));
(*BT)->data=ch;
(*BT)->Left=NULL;
(*BT)->Right=NULL;
creat_BinTree(&((*BT)->Left));
creat_BinTree(&((*BT)->Right));
}
return ;
}
//非递归前序遍历
void PreOrder(BinTree BT){
BinTree T=BT;
stack<BinTNode*> s;
while(T||!s.empty()){
//第一次访问入栈,入栈后就输出;不能出栈,结点还有用,访问右子树时会用到
while(T){
s.push(T);
printf("%c ",T->data);
T=T->Left;
}
if(!s.empty()){
T=s.top();
s.pop();
T=T->Right;
}
}
}
//非递归中序遍历
void InOrder(BinTree BT){
BinTree T=BT;
stack<BinTNode*> s;
while(T||!s.empty()){
//第一次访问就入栈
while(T){
s.push(T);
T=T->Left;
}
//再次访问到时,说明没有左子树了,弹出并输出,然后访问右子树
if(!s.empty()){
T=s.top();
s.pop();
printf("%c ",T->data);
T=T->Right;
}
}
}
//非递归后序遍历
void PostOrder(BinTree BT){
BinTree T,r;
stack<BinTNode*> s;
T=BT,r=NULL;
while(T||!s.empty()){
if(T){
s.push(T);
T=T->Left;
}else{
T=s.top();
if(T->Right && T->Right!=r){ //不等于r表示右子树没有遍历过
T=T->Right;
}else{
T=s.top();
s.pop();
printf("%c ",T->data);
r=T;
T=NULL;
}
}
}
}
int main(int argc, char** argv) {
BinTree Tree;
creat_BinTree(&Tree);
PreOrder(Tree);
printf("\n");
InOrder(Tree);
printf("\n");
PostOrder(Tree);
return 0;
}