发新话题
打印

我写的后序非递归遍历算法

我写的后序非递归遍历算法

今天写的:VC6.0下通过

//后序遍历非递归算法 2004/8/8

#include <iostream.h>

typedef struct node { int data; struct node* left; struct node* right; }node;

//层次遍历二叉树所用到的队列

class queue { public: queue() { q=new node*[10]; front=0; rear=0; maxsize=10;

} int IsFull() { if((rear+1)%maxsize==front) return 1; else return 0; } int IsEmpty() { if(front==rear) return 1; else return 0; } void InQueue(node* p) { if(IsFull()) { cout<<"队列满!!进队失败!!"<<endl; return; } else { q[rear]=p; rear=(rear+1)%maxsize; } } node* OutQueue() { if(IsEmpty()) { cout<<"队列空!!出队失败!!"<<endl; return 0; } else { node* t; t=q[front]; front=(front+1)%maxsize; return t; } }

private: node** q; int front; int rear; int maxsize; };

// 非递归后序遍历二叉树 工作栈

//首先需要一个结构,存tag; typedef struct Mystruct { node* p; int tag; }Mystruct;

class stack { public: Mystruct* s; int top; int size;

public: void push(Mystruct x) { if(IsFull()) { cout<<"栈己满!!"<<endl; return; } s[++top]=x; }

void ptop() { if(IsEmpty()) { cout<<"栈己空!!"<<endl; } else { top--; }

} Mystruct pop() { if(IsEmpty()) { cout<<"栈己空!!"<<endl; Mystruct m; m.p =0; m.tag =0; return m;

} return s[top--]; } stack() { top=-1; size=100; s=new Mystruct[100]; } int IsEmpty () { if(top==-1) return 1; else return 0; }

int IsFull() { if(top==size-1) return 1; else return 0; }

};

//全局变量 queue q1; stack s1;

//层次生成二叉树 node* CreateBtree() { int data; cout<<"请输入根结点: "; cin>>data; node* root; root=new node; root->data =data; root->left =0; root->right =0; q1.InQueue (root); node* p; while(!q1.IsEmpty ()) { p=q1.OutQueue (); cout<<"请输入"<<p->data <<"的左子树: "; cin>>data;

node* l; if(data) { l=new node; l->data =data; l->left =0; l->right =0; p->left =l; q1.InQueue (l); }

cout<<"请输入"<<p->data <<"的右子树: "; cin>>data;

if(data) { l=new node; l->data =data; l->left =0; l->right =0; p->right =l; q1.InQueue (l); } } return root;

}

//第一次写的后序遍历非递归算法 2004/8/8 void backtravel(node* p) { Mystruct mystruct; while(1) { while(p!=0) { mystruct.p =p; mystruct.tag =0; s1.push (mystruct); p=p->left ; } if(s1.s[s1.top].tag ==0) { s1.s[s1.top].tag =1; p=s1.s[s1.top].p ; p=p->right ; } else { if(s1.IsEmpty ()) break; cout<<s1.s[s1.top].p->data <<" "; s1.ptop (); //弹出栈顶元素。 } } }

//上面这个算法用了两重循环,且当遍历空树时会出错 //我改进了上面的算法,如下: //改进的后序非递归遍历算法 2004/8/8 void backtravel1(node* p) { Mystruct mystruct; while(p!=0|| !s1.IsEmpty ()) { if(p) { mystruct.p =p; mystruct.tag =0; s1.push (mystruct); p=p->left ;

} else { if(s1.s[s1.top].tag ==0) { s1.s[s1.top].tag =1; p=s1.s[s1.top].p ; p=p->right ; } else { cout<<s1.s[s1.top].p->data <<" "; s1.ptop (); //弹出栈顶元素。 } } } }

void main() { node* root; root=CreateBtree(); backtravel1(root);

}

[em02][em02]
骑着小猪学VC~~~~~~~~

TOP

UP一下

[em01]
多多交流.多多关照.

TOP

不错,不过,既然用的事C++,就应该把层次生成二叉树、后序遍历的操作也包装到二叉树对象中去,并利用模板改善程序的适应性!

TOP

楼上说的有理

[em01]
多多交流.多多关照.

TOP

呵呵,你说的有道理。我写东西的随意性太大,有时我都想到什么就怎么写,

比如:

class stack { public: Mystruct* s; int top; int size;

用private,操作栈顶又要用一个函数,觉得麻烦。

[em04][em04][em04][em04]

骑着小猪学VC~~~~~~~~

TOP

我要向你们学习

TOP

[em06]
多多交流.多多关照.

TOP

[em05]
数学计算机群:24651893

TOP

不如把精华顶上来看
版主

TOP

发新话题