二叉树非递归遍历(前序、中序、后序)
2014-01-02 08:42
357 查看
#include <iostream> #include <stack> using namespace std; struct node{ node *left; node *right; char value; }; class CBiTree{ private: node *root; void visit(node *n); void CreateBitree(node **r); void DestroyBitree(node *r); public: CBiTree(); ~CBiTree(); void preorder(); void inorder(); void postorder(); }; CBiTree::CBiTree(){ CreateBitree(&root); } CBiTree::~CBiTree(){ DestroyBitree(root); } void CBiTree::CreateBitree(node **r){ char ch; cin>>ch; if('.'==ch){ *r=NULL; } else { *r=new node; (*r)->value=ch; CreateBitree(&((*r)->left)); CreateBitree(&((*r)->right)); } } void CBiTree::DestroyBitree(node *r){ if(r!=NULL){ DestroyBitree(r->left); DestroyBitree(r->right); delete r; } } void CBiTree::visit(node *n){ cout<<n->value<<" "; } void CBiTree::preorder(){ stack<node*> st; node *p=root; while(p!=NULL||!st.empty()){ if(p!=NULL){ visit(p); st.push(p); p=p->left; } else{ p=st.top();st.pop(); p=p->right; } } } void CBiTree::inorder(){ stack<node*> st; node *p=root; while(p!=NULL||!st.empty()){ if(p!=NULL){ st.push(p); p=p->left; } else{ p=st.top();st.pop(); visit(p); p=p->right; } } } void CBiTree::postorder(){ stack<node*> st; node *p=root,*q=NULL; while(p!=NULL||!st.empty()){ if(p!=NULL){ st.push(p); p=p->left; } else{ p=st.top(); if(p->right==NULL||p->right==q){ visit(p); q=p; st.pop(); p=NULL; } else{ p=p->right; } } } } int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); int n; cin>>n; while(n-->0){ CBiTree *t=new CBiTree; cout<<"preorder:";t->preorder();cout<<endl; cout<<"inorder:";t->inorder();cout<<endl; cout<<"postorder:";t->postorder();cout<<endl; delete t; } return 0; }
相关文章推荐
- 二叉树遍历 非递归 C++实现代码
- c++二叉树的几种遍历算法
- 先序遍历 中序遍历 后序遍历
- 二叉树先序中序后序遍历递归和非递归算法
- 多伦多大学大一学生C语言作业
- toj2801 Binary Trees
- toj1144 Tree Recovery
- 二叉树递归遍历算法(前序、中序、后序)
- 二叉树遍历(递归)
- 二叉树的操作 code
- 温习之数据结构--二叉树
- 二叉树的基本操作
- 二叉树的完整操作
- 简单的二叉排序树创建及遍历
- 二叉树遍历的非递归写法(伪代码)
- 递归、栈、非递归非栈实现二叉树的遍历
- 找到二叉树中的最大搜索二叉子树
- 【UVA 548 Tree】二叉树构造 & 遍历
- C++森林转化为二叉树代码
- 二叉树的线索化以及遍历(前序、中序、后序)