二叉数的遍历

王朝百科·作者佚名  2010-09-04  
宽屏版  字体: |||超大  

二叉树的遍历

• Preorder前序遍历——访问结点的操作发生在遍历其左右子树之前

• Inorder中序遍历——访问结点的操作发生在遍历其左右子树之前

• Postorder后序遍历——访问结点的操作发生在遍历其左右子树之后

• Level order层次遍历

Preorder traversal(中->左->右)

template<class T>

void PreOrder(BinaryNode<T>* t) // preorder traversal of *t.

{

if(t)

{

visit(t);

PreOrder(tàLeft);

PreOrder(tàRight);

}

}

Inorder traversal(左->中->右)

//递归算法

template<class T>

void InOrder(BinaryNode<T>* t)

{

if(t)

{

InOrder(tàLeft);

visit(t);

InOrder(tàRight);

}

}

//非递归算法

void Inorder(BinaryNode <T> * t)

{

Stack<BinaryNode<T>*> s(10);

BinaryNode<T> * p = t;

for ( ; ; )

{

1) while(p!=NULL)

{ s.push(p); p = p->Left; }

2) if (!s.IsEmpty( ))

{

p = s.pop( );

cout << p->element;

p = p->Right;

}

else

return;

}

}

Postorder traversal(左->右->中)

//递归算法

template<class T>

void PostOrder(BinaryNode<T>* t)

{

if(t)

{

PostOrder(tàLeft);

PostOrder(tàRight);

visit(t);

}

}

//非递归算法

struct StkNode

{

BinaryNode <T> * ptr;

int tag;

}

void Postorder(BinaryNode <T> * t)

{

Stack <StkNode<T>>s(10);

StkNode<T> Cnode;

BinaryNode<T> * p = t;

for( ; ; )

{

1)while (p!=NULL)

{

Cnode.ptr = p;

Cnode.tag = 0;

s.push(Cnode);

p = p->Left;

}

2)Cnode = s.pop( );

p = Cnode.ptr;

3)while ( Cnode.tag = = 1) //从右子树回来

{

cout << p->element;

if ( !s.IsEmpty( ))

{

Cnode = s.pop( );

p = Cnode.ptr;

}

else

return;

}

4)Cnode.tag = 1;

s.push(Cnode);

p = p->Right; //从左子树回来

}//for

}

Level order:it is a non-recursive function and a queue is used.

template<class T>

void LevelOrder(BinaryNode<T>* t)

{

LinkedQueue<BinaryNode<T>*> Q;

while(t)

{

visit(t); //visit t

if(tàLeft)

Q.Add(tàLeft);

if(tàRight)

Q.Add(tàRight);

try

{

Q.Delete(t);

}catch(OutOfBounds){return;}

}

}

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝百科 版权所有