二叉树的多种遍历方式
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]
[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]
相关文章推荐
- [数据结构与算法]二叉树的多种遍历方式
- Java实现二叉树的遍历(多种方式实现前中后序的遍历)
- 扩展的先序遍历序列建立以二叉链表方式存储的二叉树,后序遍历
- 二叉树三种遍历方式之循环
- Java遍历二叉树各种方式(code)
- 数据结构_输出二叉树中先序、中序、后序遍历方式中第k个节点的数据
- 遍历Map集合的多种方式
- 二叉树的遍历方式总结
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- JS遍历的多种方式
- 二叉树的三种遍历方式(递归和非递归的实现方法)
- 从递归的异同分析二叉树先序、中序、后序遍历共同流程并实现非递归方式的三种遍历。
- 用递归方式实现二叉树先序、中序、后序遍历
- 二叉树三种遍历方式,先序、中序、后序
- 编程之美问题之二叉树层序遍历多种解法
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
- 数据结构--树:二叉树的遍历方式(递归和非递归)
- 二叉树的三种遍历方式:递归、栈、循环 分类: C/C++ 数据结构与算法 2015-06-21 09:47 269人阅读 评论(0) 收藏
- 二叉树的遍历方式
- 二叉树的三种遍历方式的递归实现和非递归实现