数据结构定义
typedef struct BTNode{
int data;
BTNode * lchild=NULL;
BTNode * rchild=NULL;
BTNode(int d):data(d){
}
}BTNode;
非递归前序
void pre_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
S[++top] = p; //根节点入栈
while(top>=0){
BTNode* node=S[top--];
visit(node);
if(node->rchild)
S[++top] = node->rchild;
if(node->lchild)
S[++top] = node->lchild;
}
}
非递归中序
void in_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
// S[++top] = p; //不需要根节点入栈
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){ //出栈置右
p=S[top--];
visit(p);
p=p->rchild;
}
}
}
口诀:
- 栈空p空 停止循环
- 移最左下
- 出栈置右
非递归后序
void post_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){
p=S[top]; //查看栈顶结点
if(p->rchild && p->rchild!=r){ //右存未访
p=p->rchild; //压右入左
S[++top]=p;
p=p->lchild;
}else{
p=S[top--]; //否则出栈
visit(p);
r=p;
p=NULL;
}
}
}
}
口诀:
- 栈空p空 停止循环
- 移最左下
- 右存未访 压右入左
- 否则出栈
完整代码
#include <bits/stdc++.h>
#define LEN 100
using namespace std;
typedef struct BTNode{
int data;
BTNode * lchild=NULL;
BTNode * rchild=NULL;
BTNode(int d):data(d){
}
}BTNode;
BTNode* create_demo_tree(){
BTNode* rt=new BTNode(1);
BTNode* rt_l=rt->lchild=new BTNode(2);
rt->rchild=new BTNode(4);
rt_l->lchild=new BTNode(3);
rt_l->rchild=new BTNode(5);
return rt;
}
int visit(BTNode* p){
cout<<p->data<<' ';
}
int in_order(BTNode* p){
if(p){
in_order(p->lchild);
visit(p);
in_order(p->rchild);
}
}
void pre_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
S[++top] = p; //根节点入栈
while(top>=0){
BTNode* node=S[top--];
visit(node);
if(node->rchild)
S[++top] = node->rchild;
if(node->lchild)
S[++top] = node->lchild;
}
}
void in_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
// S[++top] = p; //不需要根节点入栈
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){ //出栈置右
p=S[top--];
visit(p);
p=p->rchild;
}
}
}
void post_order_norRecursion(BTNode* p){
BTNode* S[LEN]; //定义工作栈
int top=-1; //栈顶指针
BTNode* r=NULL; //指向最近访问过的节点
while(top>=0 || p){//栈空p空 停止循环
while(p){ //移最左下
S[++top]=p;
p=p->lchild;
}
if(top>=0){
p=S[top]; //查看栈顶结点
if(p->rchild && p->rchild!=r){ //右存未访
p=p->rchild; //压右入左
S[++top]=p;
p=p->lchild;
}else{
p=S[top--]; //否则出栈
visit(p);
r=p;
p=NULL;
}
}
}
}
int main(){
BTNode* root=create_demo_tree();
// in_order(root);
// pre_order_norRecursion(root);
post_order_norRecursion(root);
return 0;
}