另一种先序遍历和中序遍历的非递归算法

来源:互联网 发布:php是什么文件格式 编辑:程序博客网 时间:2024/06/05 23:54
#include <iostream>using namespace std;//================================栈定义=========================template <typename T> class Stack{private:class Element{public:T value;Element(T v){value = v;next = NULL;}Element* next;};Element* top;public:Stack(){top = NULL;}T getTop(){return top->value;}void push(T v){Element* e = new Element(v);if(!top) {top = e;} else {e->next = top;top = e;}}T pop(){if(!top)return NULL;T v = getTop();Element* temp = top;top = top -> next;delete temp;return v;}bool isEmpty(){return top == NULL;}};//==========================二叉树=============================int count = 0;class BinTree{public:BinTree(int v){value = v;left = NULL;right = NULL;}int value;BinTree* left;BinTree* right;};void createTree(BinTree* &tree,int depth,int cur) {if(cur < depth) {tree = new BinTree(count);count++;createTree(tree->left,depth,cur+1);createTree(tree->right,depth,cur+1);} else {return;}}void print(BinTree* tree) {cout<<tree->value<<endl;}void preOrder(BinTree* tree,void visit(BinTree*)){Stack<BinTree*> stack;stack.push(tree);while(!stack.isEmpty()){tree = stack.pop();if(!tree) continue;visit(tree);if(tree->right)stack.push(tree->right);if(tree->left)stack.push(tree->left);}}void inOrder(BinTree* tree,void visit(BinTree*)){Stack<BinTree*> stack;stack.push(tree);bool firstVisit = true;while(!stack.isEmpty()){tree = stack.getTop();if(firstVisit) {if(tree->left) {stack.push(tree->left);firstVisit = true;} else {firstVisit = false;}} else {stack.pop();visit(tree);if(tree->right){stack.push(tree->right);firstVisit = true;} else {firstVisit = false;}}}}int main(){BinTree* tree;createTree(tree,4,0);cout<<"PreOrder:"<<endl;preOrder(tree,&print);cout<<endl;cout<<"InOrder:"<<endl;inOrder(tree,&print);cout<<endl;return 0;}

原创粉丝点击