1. 程式人生 > >遍歷二叉樹的各種操作(非遞迴遍歷) 轉載自:hackbuteer1 前輩

遍歷二叉樹的各種操作(非遞迴遍歷) 轉載自:hackbuteer1 前輩

在網上看了很多的人寫的二叉樹的非遞迴的遍歷,但是能執行的正確的並不多。感謝hackbuteer1  前輩  寫出了這樣清晰和完美的程式碼。

特轉載和保存於此。

        先使用先序的方法建立一棵二叉樹,然後分別使用遞迴與非遞迴的方法實現前序、中序、後序遍歷二叉樹,並使用了兩種方法來進行層次遍歷二叉樹,一種方法就是使用STL中的queue,另外一種方法就是定義了一個數組佇列,分別使用了front和rear兩個陣列的下標來表示入隊與出隊,還有兩個操作就是求二叉樹的深度、結點數。。。

  1. //轉載請標明出處,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6583988
  2. #include<iostream>  
  3. #include<queue>  
  4. #include<stack>  
  5. usingnamespace std;    
  6. //二叉樹結點的描述  
  7. typedefstruct BiTNode  
  8. {    
  9.     char data;    
  10.     struct BiTNode *lchild, *rchild;      //左右孩子  
  11. }BiTNode,*BiTree;    
  12. //按先序遍歷建立二叉樹  
  13. //BiTree *CreateBiTree()     //返回結點指標型別  
  14. //void CreateBiTree(BiTree &root)      //引用型別的引數  
  15. void CreateBiTree(BiTNode **root)    //二級指標作為函式引數  
  16. {    
  17.     char ch; //要插入的資料  
  18.     scanf("\n%c", &ch);  
  19.     //cin>>ch;  
  20.     if(ch=='#')  
  21.         *root = NULL;  
  22.     else
  23.     {  
  24.         *root = (BiTNode *)malloc(sizeof(BiTNode));  
  25.         (*root)->data = ch;  
  26.         printf("請輸入%c的左孩子:"
    ,ch);  
  27.         CreateBiTree(&((*root)->lchild));  
  28.         printf("請輸入%c的右孩子:",ch);  
  29.         CreateBiTree(&((*root)->rchild));  
  30.     }  
  31. }  
  32. //前序遍歷的演算法程式  
  33. void PreOrder(BiTNode *root)  
  34. {    
  35.     if(root==NULL)    
  36.         return ;    
  37.     printf("%c ", root->data); //輸出資料  
  38.     PreOrder(root->lchild); //遞迴呼叫,前序遍歷左子樹  
  39.     PreOrder(root->rchild); //遞迴呼叫,前序遍歷右子樹  
  40. }    
  41. //中序遍歷的演算法程式  
  42. void InOrder(BiTNode *root)    
  43. {    
  44.     if(root==NULL)  
  45.         return ;  
  46.     InOrder(root->lchild); //遞迴呼叫,前序遍歷左子樹  
  47.     printf("%c ", root->data); //輸出資料  
  48.     InOrder(root->rchild); //遞迴呼叫,前序遍歷右子樹  
  49. }    
  50. //後序遍歷的演算法程式  
  51. void PostOrder(BiTNode *root)  
  52. {  
  53.     if(root==NULL)  
  54.         return ;  
  55.     PostOrder(root->lchild);      //遞迴呼叫,前序遍歷左子樹  
  56.     PostOrder(root->rchild);      //遞迴呼叫,前序遍歷右子樹  
  57.     printf("%c ", root->data);    //輸出資料    
  58. }    
  59. /*  
  60. 二叉樹的非遞迴前序遍歷,前序遍歷思想:先讓根進棧,只要棧不為空,就可以做彈出操作,  
  61. 每次彈出一個結點,記得把它的左右結點都進棧,記得右子樹先進棧,這樣可以保證右子樹在棧中總處於左子樹的下面。  
  62. */
  63. void PreOrder_Nonrecursive(BiTree T)     //先序遍歷的非遞迴    
  64. {    
  65.     if(!T)      
  66.         return ;      
  67.     stack<BiTree> s;    
  68.     s.push(T);    
  69.     while(!s.empty())    
  70.     {    
  71.         BiTree temp = s.top();    
  72.         cout<<temp->data<<" ";    
  73.         s.pop();    
  74.         if(temp->rchild)    
  75.             s.push(temp->rchild);    
  76.         if(temp->lchild)    
  77.             s.push(temp->lchild);    
  78.     }    
  79. }    
  80. void PreOrder_Nonrecursive1(BiTree T)     //先序遍歷的非遞迴 
  81. {  
  82.     if(!T)    
  83.         return ;  
  84.     stack<BiTree> s;  
  85.     BiTree curr = T;  
  86.     while(curr != NULL || !s.empty())  
  87.     {  
  88.         while(curr != NULL)  
  89.         {  
  90.             cout<<curr->data<<"  ";  
  91.             s.push(curr);  
  92.             curr = curr->lchild;  
  93.         }  
  94.         if(!s.empty())  
  95.         {  
  96.             curr = s.top();  
  97.             s.pop();  
  98.             curr = curr->rchild;  
  99.         }  
  100.     }  
  101. }  
  102. void PreOrder_Nonrecursive2(BiTree T)     //先序遍歷的非遞迴  
  103. {    
  104.     if(!T)  
  105.         return ;    
  106.     stack<BiTree> s;    
  107.     while(T)          // 左子樹上的節點全部壓入到棧中  
  108.     {    
  109.         s.push(T);    
  110.         cout<<T->data<<"  ";    
  111.         T = T->lchild;    
  112.     }    
  113.     while(!s.empty())    
  114.     {            
  115.         BiTree temp = s.top()->rchild;  // 棧頂元素的右子樹  
  116.         s.pop();                        // 彈出棧頂元素  
  117.         while(temp)          // 棧頂元素存在右子樹,則對右子樹同樣遍歷到最下方  
  118.         {    
  119.             cout<<temp->data<<"  ";    
  120.             s.push(temp);    
  121.             temp = temp->lchild;    
  122.         }    
  123.     }    
  124. }