您的位置:首页 > 其它

二叉树的多种遍历方式

2013-12-20 15:22 183 查看
[align=left]#ifndef __TREE_H__[/align]
[align=left]#define __TREE_H__[/align]

[align=left]#include <vector>[/align]

enum { DirLeft =
0, DirRight =
1, };

[align=left]struct node[/align]
[align=left]{[/align]
[align=left] int nNodeData ;[/align]
[align=left] node* pLeftNode ;[/align]
[align=left] node* pRightNode ;[/align]
[align=left]};[/align]

[align=left]class CTree[/align]
[align=left]{[/align]
[align=left]public :[/align]
CTree()
{}
~ CTree()
{}

[align=left] void Initialize ();[/align]
[align=left] bool InsertNode ( int nValue );[/align]

[align=left] void InOrderRecursion (); // 递归中根遍历[/align]
[align=left] void InOrderRecusionHelp ( node* pNode );[/align]
[align=left] void PreOrderRecursion (); // 递归前根遍历[/align]
[align=left] void PreOrderRecursionHelp ( node* pNode );[/align]
[align=left] void PostOrderRecursion (); // 递归后根遍历[/align]
[align=left] void PostOrderRecursionHelp ( node* pNode );[/align]

[align=left] void InOrderNoRecursion (); // 非递归中根遍历[/align]
[align=left] void PreOrderRecursionWay1 (); // 非递归前跟遍历方式[/align]
[align=left] void PreOrderRecursionWay2 (); // 非递归前跟遍历方式[/align]
[align=left] void PostOrderNoRecursion1 (); // 非递归后跟遍历方式[/align]
[align=left] void PostOrderNoRecursion2 (); // 非递归后跟遍历方式[/align]

[align=left] // 层次遍历[/align]
[align=left] void LevelTravase ();[/align]

[align=left] void PrintTree ();[/align]
[align=left]private :[/align]
[align=left] node* m_pRoot ;[/align]
[align=left] std::vector <int> m_vecInOrderRecur;[/align]
[align=left] std::vector <int> m_vecInOrderNoRecur;[/align]
[align=left] [/align]
[align=left] std::vector <int> m_vecPreOrderRecur;[/align]
[align=left] std::vector <int> m_vecPreOrderNoRecur1 ;[/align]
[align=left] std::vector <int> m_vecPreOrderNoRecur2 ;[/align]

[align=left] std::vector <int> m_vecPostOrderRecur;[/align]
[align=left] std::vector <int> m_vecPostOrderNoRecur ;[/align]
[align=left] std::vector <int> m_vecPostOrderNoRecur2 ;[/align]

[align=left] std::vector <int> m_vecLevelTravse;[/align]
[align=left]};[/align]

#endif // _TREE_H_

[align=left]// TravseTree.cpp : Defines the entry point for the console application.[/align]
[align=left]//[/align]

[align=left]#include "stdafx.h"[/align]
[align=left]#include "Tree.h"[/align]
[align=left]#include <iostream>[/align]
[align=left]#include <list>[/align]

[align=left]void CTree:: Initialize()[/align]
[align=left]{[/align]
[align=left] m_pRoot = NULL ;[/align]
[align=left]}[/align]

[align=left]bool CTree:: InsertNode( int nValue )[/align]
[align=left]{[/align]
[align=left] node* pNewNode = new node;[/align]
if(
!pNewNode )
[align=left] {[/align]
[align=left] return false ;[/align]
[align=left] }[/align]

pNewNode->nNodeData
= nValue;
pNewNode->pLeftNode
= NULL;
[align=left] pNewNode->pRightNode = NULL;[/align]

[align=left] if( m_pRoot == NULL )[/align]
[align=left] {[/align]
[align=left] m_pRoot = pNewNode ;[/align]
[align=left] return true ;[/align]
[align=left] }[/align]

int nDir =
-1;
[align=left] node* pFindPlace = m_pRoot;[/align]
while(
1 )
[align=left] {[/align]
if( nValue >
( pFindPlace-> nNodeData )
)
[align=left] {[/align]
[align=left] if( pFindPlace ->pRightNode )[/align]
[align=left] pFindPlace = pFindPlace ->pRightNode;[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] nDir = DirRight ;[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] if( pFindPlace ->pLeftNode )[/align]
[align=left] pFindPlace = pFindPlace ->pLeftNode;[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] nDir = DirLeft ;[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]

[align=left] if( DirLeft == nDir )[/align]
pFindPlace->pLeftNode
= pNewNode;
[align=left] else[/align]
[align=left] pFindPlace->pRightNode = pNewNode;[/align]
[align=left] return true ;[/align]
[align=left]}[/align]

[align=left]void CTree:: InOrderRecursion()[/align]
[align=left]{[/align]
[align=left] m_vecInOrderRecur.clear ();[/align]
[align=left] InOrderRecusionHelp( m_pRoot );[/align]
[align=left]}[/align]

[align=left]void CTree:: InOrderRecusionHelp( node * pNode )[/align]
[align=left]{[/align]
if(
!pNode )
[align=left] return ;[/align]

[align=left] InOrderRecusionHelp( pNode ->pLeftNode );[/align]
[align=left] m_vecInOrderRecur.push_back ( pNode-> nNodeData );[/align]
[align=left] InOrderRecusionHelp( pNode ->pRightNode );[/align]
[align=left]}[/align]

[align=left]void CTree:: InOrderNoRecursion()[/align]
[align=left]{[/align]
[align=left] node* pNode = m_pRoot;[/align]
[align=left] std::vector <node*> listNodeSet;[/align]
[align=left] listNodeSet.clear ();[/align]
[align=left] m_vecInOrderNoRecur.clear ();[/align]

[align=left] do[/align]
[align=left] {[/align]
[align=left] while( pNode )[/align]
[align=left] {[/align]
[align=left] listNodeSet.push_back ( pNode );[/align]
[align=left] pNode = pNode ->pLeftNode;[/align]
[align=left] }[/align]

[align=left] pNode = listNodeSet .back();[/align]
[align=left] m_vecInOrderNoRecur.push_back ( pNode-> nNodeData );[/align]
[align=left] listNodeSet.pop_back ();[/align]
[align=left] [/align]
[align=left] pNode = pNode ->pRightNode;[/align]
} while( pNode ||
!listNodeSet. empty()
);
[align=left]}[/align]

[align=left]void CTree:: PreOrderRecursion()[/align]
[align=left]{[/align]
[align=left] m_vecPreOrderRecur.clear ();[/align]
[align=left] PreOrderRecursionHelp ( m_pRoot );[/align]
[align=left]}[/align]

[align=left]void CTree:: PreOrderRecursionHelp ( node* pNode )[/align]
[align=left]{[/align]
if(
!pNode )
[align=left] return ;[/align]

[align=left] m_vecPreOrderRecur.push_back ( pNode-> nNodeData );[/align]
[align=left] PreOrderRecursionHelp ( pNode-> pLeftNode );[/align]
[align=left] PreOrderRecursionHelp ( pNode-> pRightNode );[/align]
[align=left]}[/align]

[align=left]void CTree:: PreOrderRecursionWay1 ()[/align]
[align=left]{[/align]
[align=left] m_vecPreOrderNoRecur1 .clear();[/align]
[align=left] std::vector <node*> vecNodeSet;[/align]
[align=left] vecNodeSet.clear ();[/align]
[align=left] vecNodeSet.push_back ( m_pRoot );[/align]
[align=left] node* pTempNode ;[/align]

while(
!vecNodeSet .empty()
)
[align=left] {[/align]
[align=left] pTempNode = vecNodeSet .back();[/align]
[align=left] vecNodeSet.pop_back ();[/align]
[align=left] m_vecPreOrderNoRecur1 .push_back( pTempNode ->nNodeData );[/align]

[align=left] if( pTempNode ->pRightNode )[/align]
[align=left] vecNodeSet.push_back ( pTempNode-> pRightNode );[/align]
[align=left] [/align]
[align=left] if( pTempNode ->pLeftNode )[/align]
[align=left] vecNodeSet.push_back ( pTempNode-> pLeftNode );[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]void CTree:: PreOrderRecursionWay2 ()[/align]
[align=left]{[/align]
[align=left] m_vecPreOrderNoRecur2 .clear();[/align]
[align=left] std::vector <node*> vecNodeStack;[/align]
[align=left] vecNodeStack.clear ();[/align]
[align=left] node* TempNode = m_pRoot;[/align]

[align=left] do[/align]
[align=left] {[/align]
[align=left] while( TempNode )[/align]
[align=left] {[/align]
[align=left] m_vecPreOrderNoRecur2 .push_back( TempNode ->nNodeData );[/align]
[align=left] vecNodeStack.push_back ( TempNode );[/align]
[align=left] TempNode = TempNode ->pLeftNode;[/align]
[align=left] }[/align]

[align=left] TempNode = vecNodeStack .back();[/align]
[align=left] vecNodeStack.pop_back ();[/align]

[align=left] TempNode = TempNode ->pRightNode;[/align]
} while(
!( NULL == TempNode && vecNodeStack.empty ()
) );
[align=left]}[/align]

[align=left]void CTree:: PostOrderRecursion()[/align]
[align=left]{[/align]
[align=left] m_vecPostOrderRecur.clear ();[/align]
[align=left] PostOrderRecursionHelp ( m_pRoot );[/align]
[align=left]}[/align]

[align=left]void CTree:: PostOrderRecursionHelp ( node* pNode )[/align]
[align=left]{[/align]
if(
!pNode )
[align=left] return ;[/align]

[align=left] PostOrderRecursionHelp ( pNode-> pLeftNode );[/align]
[align=left] PostOrderRecursionHelp ( pNode-> pRightNode );[/align]
[align=left] m_vecPostOrderRecur.push_back ( pNode-> nNodeData );[/align]
[align=left]}[/align]

[align=left]void CTree:: PostOrderNoRecursion1 ()[/align]
[align=left]{[/align]
[align=left] m_vecPostOrderNoRecur .clear();[/align]
[align=left] std::vector <node*> vecNodeSet;[/align]
[align=left] vecNodeSet.clear ();[/align]
[align=left] vecNodeSet.push_back ( m_pRoot );[/align]

while(
!vecNodeSet .empty()
)
[align=left] {[/align]
[align=left] node* p = vecNodeSet. back();[/align]
[align=left] vecNodeSet.pop_back ();[/align]
[align=left] m_vecPostOrderNoRecur .push_back( p->nNodeData );[/align]

[align=left] if( p ->pLeftNode )[/align]
[align=left] vecNodeSet.push_back ( p-> pLeftNode );[/align]
[align=left] if( p ->pRightNode )[/align]
[align=left] vecNodeSet.push_back ( p-> pRightNode );[/align]
[align=left] }[/align]

[align=left] int nSize = m_vecPostOrderNoRecur.size ();[/align]
[align=left] -- nSize;[/align]
[align=left] int nTempData ;[/align]
for( int i =
0; i < nSize ;
++i,
-- nSize )
[align=left] {[/align]
[align=left] nTempData = m_vecPostOrderNoRecur [i];[/align]
m_vecPostOrderNoRecur [i]
= m_vecPostOrderNoRecur [nSize];
m_vecPostOrderNoRecur [nSize]
= nTempData;
[align=left] }[/align]
[align=left]}[/align]

[align=left]void CTree:: PostOrderNoRecursion2 ()[/align]
[align=left]{[/align]
[align=left] m_vecPostOrderNoRecur2 .clear();[/align]
[align=left] std::vector <node*> vecNodeStack;[/align]
[align=left] vecNodeStack.clear ();[/align]
[align=left] node* TempNode = m_pRoot;[/align]

[align=left] do[/align]
[align=left] {[/align]
[align=left] while( TempNode )[/align]
[align=left] {[/align]
[align=left] m_vecPostOrderNoRecur2 .push_back( TempNode ->nNodeData );[/align]
[align=left] vecNodeStack.push_back ( TempNode );[/align]
[align=left] TempNode = TempNode ->pRightNode;[/align]
[align=left] }[/align]

[align=left] TempNode = vecNodeStack .back();[/align]
[align=left] vecNodeStack.pop_back ();[/align]

[align=left] TempNode = TempNode ->pLeftNode;[/align]
} while(
!( NULL == TempNode && vecNodeStack.empty ()
) );
[align=left]}[/align]

[align=left]void CTree:: LevelTravase()[/align]
[align=left]{[/align]
[align=left] m_vecLevelTravse.clear ();[/align]
[align=left] std::list <node*> listNodeQueue;[/align]
[align=left] listNodeQueue.clear ();[/align]
[align=left] listNodeQueue.push_back ( m_pRoot );[/align]

while(
!listNodeQueue .empty()
)
[align=left] {[/align]
[align=left] node* pFindNode = listNodeQueue. front();[/align]
[align=left] listNodeQueue.pop_front ();[/align]

[align=left] m_vecLevelTravse.push_back ( pFindNode-> nNodeData );[/align]

[align=left] if( pFindNode ->pLeftNode )[/align]
[align=left] listNodeQueue.push_back ( pFindNode ->pLeftNode );[/align]

[align=left] if( pFindNode ->pRightNode )[/align]
[align=left] listNodeQueue.push_back ( pFindNode ->pRightNode );[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]void CTree:: PrintTree()[/align]
[align=left]{[/align]
[align=left] int nSize = m_vecInOrderRecur. size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 中序遍历 ----递归------------" <<std:: endl<<std ::endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<<m_vecInOrderRecur [i]<< "
"<< std::endl ;
[align=left] }[/align]

[align=left] nSize = m_vecInOrderNoRecur .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 中序遍历 ----非递归------------"<< std::endl <<std:: endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<< m_vecInOrderNoRecur[i ]<<"
"<< std::endl ;
[align=left] }[/align]

[align=left] nSize = m_vecPreOrderRecur .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 前序遍历 ----递归------------" <<std:: endl<<std ::endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<<m_vecPreOrderRecur [i]<< "
"<< std::endl ;
[align=left] }[/align]

[align=left] nSize = m_vecPreOrderNoRecur1 .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 前序遍历 ----非递归------------"<< std::endl <<std:: endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<< m_vecPreOrderNoRecur1 [i]<< "
"<<std ::endl;
[align=left] }[/align]

[align=left] nSize = m_vecPreOrderNoRecur2 .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 前序遍历 ----非递归------------"<< std::endl <<std:: endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<< m_vecPreOrderNoRecur2 [i]<< "
"<<std ::endl;
[align=left] }[/align]
[align=left] [/align]
[align=left] nSize = m_vecPostOrderRecur .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 后序遍历 ----递归------------" <<std:: endl<<std ::endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<< m_vecPostOrderRecur[i ]<<"
"<< std::endl ;
[align=left] }[/align]

[align=left] nSize = m_vecPostOrderNoRecur .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 后序遍历 ----非递归------------"<< std::endl <<std:: endl;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<< m_vecPostOrderNoRecur [i]<< "
"<<std ::endl;
[align=left] }[/align]

[align=left] nSize = m_vecPostOrderNoRecur2 .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 后序遍历 ----非递归------------"<< std::endl <<std:: endl;[/align]
for( int i = nSize -
1; i >=
0; --i )
std::cout <<"
"<< m_vecPostOrderNoRecur2 [i]<< "
"<<std ::endl;
[align=left] }[/align]

[align=left] nSize = m_vecLevelTravse .size();[/align]
if( nSize !=
0 )
[align=left] {[/align]
[align=left] std::cout <<" 层次遍历 ------------"<<std ::endl<< std::endl ;[/align]
for( int i =
0; i < nSize ;
++i )
std::cout <<"
"<<m_vecLevelTravse [i]<< "
"<< std::endl ;
[align=left] }[/align]
[align=left]}[/align]

[align=left]#include "stdafx.h"[/align]
[align=left]#include "Tree.h"[/align]

const static int A [8]
= { 14, 5, 10, 23, 6, 90, 2, 31 };

[align=left]int main()[/align]
[align=left]{[/align]
[align=left] CTree tree ;[/align]
[align=left] tree.Initialize ();[/align]
for( int i =
0; i <
8; ++i )
tree.InsertNode ( A[ i]
);

[align=left] tree.InOrderRecursion ();[/align]
[align=left] tree.InOrderNoRecursion ();[/align]
[align=left] [/align]
[align=left] tree.PreOrderRecursion ();[/align]
[align=left] tree.PreOrderRecursionWay1 ();[/align]
[align=left] tree.PreOrderRecursionWay2 ();[/align]

[align=left] tree.PostOrderRecursion ();[/align]
[align=left] tree.PostOrderNoRecursion1 ();[/align]
[align=left] tree.PostOrderNoRecursion2 ();[/align]

[align=left] tree.LevelTravase ();[/align]

[align=left] tree.PrintTree ();[/align]

[align=left] system( "pause" );[/align]
[align=left] return 0;[/align]
[align=left]}[/align]



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: