二叉树的多种遍历方式

#ifndef   __TREE_H__
#define   __TREE_H__

#include   <vector>

enum     DirLeft   = 0,   DirRight   = 1, };

struct   node
{
        int       nNodeData   ;
        node   pLeftNode   ;
        node   pRightNode   ;
};

class   CTree
{
public   :
        CTree ()   {}
     ~   CTree ()  {}

        void   Initialize   ();
        bool   InsertNode   (   int   nValue   );

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

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

        //   层次遍历
        void   LevelTravase   ();

        void   PrintTree   ();
private   :
        node *   m_pRoot   ;
        std :: vector   < int >   m_vecInOrderRecur ;
        std :: vector   < int >   m_vecInOrderNoRecur ;
     
        std :: vector   < int >   m_vecPreOrderRecur ;
        std :: vector   < int >   m_vecPreOrderNoRecur1   ;
        std :: vector   < int >   m_vecPreOrderNoRecur2   ;

        std :: vector   < int >   m_vecPostOrderRecur ;
        std :: vector   < int >   m_vecPostOrderNoRecur   ;
        std :: vector   < int >   m_vecPostOrderNoRecur2   ;

        std :: vector   < int >   m_vecLevelTravse ;
};




#endif
  // _TREE_H_

// TravseTree.cpp : Defines the entry point for the console application.
//

#include   "stdafx.h"
#include   "Tree.h"
#include   <iostream>
#include   <list>

void   CTree ::   Initialize ()
{
        m_pRoot   =   NULL   ;
}

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

        pNewNode -> nNodeData     =   nValue ;
        pNewNode -> pLeftNode     =   NULL ;
        pNewNode -> pRightNode   =   NULL ;

        if (   m_pRoot   ==   NULL   )
     {
             m_pRoot   =   pNewNode   ;
             return   true   ;
     }

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

        if (   DirLeft   ==   nDir   )
             pFindPlace -> pLeftNode     =   pNewNode ;
        else
             pFindPlace -> pRightNode   =   pNewNode ;
        return   true   ;
}


void   CTree ::   InOrderRecursion ()
{
        m_vecInOrderRecur . clear   ();
        InOrderRecusionHelp (   m_pRoot   );
}

void   CTree ::   InOrderRecusionHelp (   node   *   pNode   )
{
        if ( ! pNode   )
             return   ;

        InOrderRecusionHelp (   pNode   -> pLeftNode   );
        m_vecInOrderRecur . push_back   (   pNode ->   nNodeData   );
        InOrderRecusionHelp (   pNode   -> pRightNode   );
}

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

        do
     {
             while (   pNode   )
          {
                 listNodeSet . push_back   (   pNode   );
                 pNode   =   pNode   -> pLeftNode ;
          }

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

void   CTree ::   PreOrderRecursion ()
{
        m_vecPreOrderRecur . clear   ();
        PreOrderRecursionHelp   (   m_pRoot   );
}

void   CTree ::   PreOrderRecursionHelp   (   node *   pNode   )
{
        if ( ! pNode   )
             return   ;

        m_vecPreOrderRecur . push_back   (   pNode ->   nNodeData   );
        PreOrderRecursionHelp   (   pNode ->   pLeftNode   );
        PreOrderRecursionHelp   (   pNode ->   pRightNode   );
}

void   CTree ::   PreOrderRecursionWay1   ()
{
        m_vecPreOrderNoRecur1   . clear ();
        std :: vector   < node *>   vecNodeSet ;
        vecNodeSet . clear   ();
        vecNodeSet . push_back   (   m_pRoot   );
        node *   pTempNode   ;

        while ( ! vecNodeSet   . empty () )
     {
             pTempNode   =   vecNodeSet   . back ();
             vecNodeSet . pop_back   ();
             m_vecPreOrderNoRecur1   . push_back (   pTempNode   -> nNodeData   );

             if (   pTempNode   -> pRightNode   )
                 vecNodeSet . push_back   (   pTempNode ->   pRightNode   );
          
             if (   pTempNode   -> pLeftNode   )
                 vecNodeSet . push_back   (   pTempNode ->   pLeftNode   );
     }
}


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

        do
     {
             while (   TempNode   )
          {
                 m_vecPreOrderNoRecur2   . push_back (   TempNode   -> nNodeData   );
                 vecNodeStack . push_back   (   TempNode   );
                 TempNode   =   TempNode   -> pLeftNode ;
          }

             TempNode   =   vecNodeStack   . back ();
             vecNodeStack . pop_back   ();

             TempNode   =   TempNode   -> pRightNode ;
     }   while ( !(   NULL   ==   TempNode   &&   vecNodeStack . empty   () ) );
}


void   CTree ::   PostOrderRecursion ()
{
        m_vecPostOrderRecur . clear   ();
        PostOrderRecursionHelp   (   m_pRoot   );
}

void   CTree ::   PostOrderRecursionHelp   (   node *   pNode   )
{
        if ( ! pNode   )
             return   ;

        PostOrderRecursionHelp   (   pNode ->   pLeftNode   );
        PostOrderRecursionHelp   (   pNode ->   pRightNode   );
        m_vecPostOrderRecur . push_back   (   pNode ->   nNodeData   );
}

void   CTree ::   PostOrderNoRecursion1   ()
{
        m_vecPostOrderNoRecur   . clear ();
        std :: vector   < node *>   vecNodeSet ;
        vecNodeSet . clear   ();
        vecNodeSet . push_back   (   m_pRoot   );

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

             if (   p   -> pLeftNode   )
                 vecNodeSet . push_back   (   p ->   pLeftNode   );
             if (   p   -> pRightNode   )
                 vecNodeSet . push_back   (   p ->   pRightNode   );
     }

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

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

        do
     {
             while (   TempNode   )
          {
                 m_vecPostOrderNoRecur2   . push_back (   TempNode   -> nNodeData   );
                 vecNodeStack . push_back   (   TempNode   );
                 TempNode   =   TempNode   -> pRightNode ;
          }

             TempNode   =   vecNodeStack   . back ();
             vecNodeStack . pop_back   ();

             TempNode   =   TempNode   -> pLeftNode ;
     }   while ( !(   NULL   ==   TempNode   &&   vecNodeStack . empty   () ) );
}

void   CTree ::   LevelTravase ()
{
        m_vecLevelTravse . clear   ();
        std :: list   < node *>   listNodeQueue ;
        listNodeQueue . clear   ();
        listNodeQueue . push_back   (   m_pRoot   );

        while ( ! listNodeQueue   . empty () )
     {
             node *   pFindNode   =   listNodeQueue .   front ();
             listNodeQueue . pop_front   ();

             m_vecLevelTravse . push_back   (   pFindNode ->   nNodeData   );

             if (   pFindNode   -> pLeftNode   )
                 listNodeQueue . push_back   (   pFindNode   -> pLeftNode   );

             if (   pFindNode   -> pRightNode   )
                 listNodeQueue . push_back   (   pFindNode   -> pRightNode   );
     }
}

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

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

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

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

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

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

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

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

#include   "stdafx.h"
#include   "Tree.h"

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

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

        tree . InOrderRecursion   ();
        tree . InOrderNoRecursion   ();
     
        tree . PreOrderRecursion   ();
        tree . PreOrderRecursionWay1   ();
        tree . PreOrderRecursionWay2   ();

        tree . PostOrderRecursion   ();
        tree . PostOrderNoRecursion1   ();
        tree . PostOrderNoRecursion2   ();

        tree . LevelTravase   ();

        tree . PrintTree   ();

        system (   "pause"   );
        return   0;
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值