二叉树的遍历分为递归和非递归。渐进的时间复杂度都是O(n),非递归算法由于没有函数递归调用的开销,有比较好的空间复杂度。
代码是根据邓俊辉老师的书来写的。
代码:
//traverse a binary tree in recursive or non recursive way
#include <iostream>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
using std::stack;
using std::queue;
#define BinNodePosi(T) BinNode<T>*
#define IsRoot(x) (!(x).parent)
#define HasLChild(x) ((x).lc)
#define HasRChild(x) ((x).rc)
#define IsLChild(x) (!IsRoot(x)&&(&(x)==(x).parent->lc))
#define IsRChild(x) (!IsRoot(x)&&(&(x)==(x).parent->rc))
template <typename T>
void visit(T t)
{
cout<<t<<" "<<endl;
}
template <typename T> class BinNode
{
public:
T data;
BinNodePosi(T) parent;
BinNodePosi(T) lc;
BinNodePosi(T) rc;
int height;
BinNode():parent(NULL),lc(NULL),rc(NULL),height(0){}
BinNode(T e,BinNodePosi(T) p=NULL,BinNodePosi(T) lc=NULL,BinNodePosi(T) rc=NULL,int h=0):
data(e),parent(p),lc(lc),rc(rc),height(h){}
BinNodePosi(T) succ();
template <typename VST>
void travPost(VST &visit)
{
travPost_I(this,visit);
}
template <typename VST>
void travPre(VST &visit)
{
travPre_I(this,visit);
}
template <typename VST>
void travIn(VST &visit)
{
srand(time(NULL));
switch(rand()%2)
{
case 0:
cout<<"(use a stack)"<<endl;
travIn_I(this,visit);
break;
case 1:
cout<<"(not use a stack)"<<endl;
tra