C++实现链式二叉树,采用非递归的方式先序,中序,后序遍历二叉树

来源:互联网 发布:js阻止事件冒泡 编辑:程序博客网 时间:2024/05/16 17:52

转自 http://blog.csdn.net/yushuai007008/article/details/7101663

如有不足之处,还望指正!

[cpp] view plaincopy
  1. // BinaryTree.cpp : 定义控制台应用程序的入口点。  
  2. //C++实现链式二叉树,采用非递归的方式先序,中序,后序遍历二叉树  
  3. #include "stdafx.h"  
  4. #include<iostream>  
  5. #include<string>  
  6. #include <stack>  
  7.   
  8. using namespace std;  
  9.   
  10. template<class T>  
  11. struct BiNode  
  12. {  
  13.     T data;  
  14.     struct BiNode<T> *rchild,*lchild;  
  15. };  
  16.   
  17. template<class T>  
  18. class BiTree  
  19. {  
  20. public:  
  21.     BiTree(){  
  22.         cout<<"请输入根节点:"<<endl;  
  23.         Create(root);  
  24.         if (NULL != root)  
  25.         {  
  26.             cout<<"root="<<root->data<<endl;  
  27.         }  
  28.         else  
  29.         {  
  30.             cout << "The BinaryTree is empty." << endl;  
  31.         }  
  32.     }  
  33.     ~BiTree(){Release(root);}  
  34.     void InOrderTraverse();  
  35.     void PreOrderTraverse();  
  36.     void PostOrderTraverse();  
  37.   
  38. private:  
  39.     BiNode<T> *root;  
  40.     void Create(BiNode<T>* &bt);  
  41.     void Release(BiNode<T> *bt);  
  42. };  
  43.   
  44. //析构函数  
  45. template <class T>  
  46. void BiTree<T>::Release(BiNode<T> *bt)   
  47. {  
  48.       
  49.     if(bt==NULL)  
  50.     {  
  51.         Release(bt->lchild );  
  52.         Release(bt->rchild );  
  53.         delete bt;  
  54.     }  
  55. }  
  56. //建立二叉树  
  57. template <class T>  
  58. void BiTree<T>::Create(BiNode<T>* &bt)   
  59. {  
  60.     T ch;  
  61.     cin>>ch;  
  62.     if(ch== 0)bt=NULL;  
  63.     else  
  64.     {  
  65.         bt=new BiNode<T>;  
  66.         bt->data =ch;  
  67.         cout<<"调用左孩子"<<endl;  
  68.         Create(bt->lchild );  
  69.         cout<<"调用右孩子"<<endl;  
  70.         Create(bt->rchild );  
  71.     }  
  72. }  
  73. /************************************************************************ 
  74. 方法:中序遍历(非递归形式) 
  75. 思想:向左走到尽头,入栈。出栈,访问节点,向右一步 
  76. ************************************************************************/  
  77. template <class T>  
  78. void BiTree<T>::InOrderTraverse()  
  79. {  
  80.     stack<BiNode<T>*> sta; //定义一个存放BiNode型指针的空栈  
  81.     BiNode<T>* p = root;  
  82.     sta.push(p);   //将根指针入栈  
  83.     while(!sta.empty())  
  84.     {  
  85.         while (NULL != p)  
  86.         {//向左走到尽头,并保留所经过的节点指针,入栈  
  87.             p = p->lchild;   
  88.             if (NULL != p)  
  89.             {  
  90.                 sta.push(p);  
  91.             }  
  92.         }  
  93.   
  94.         if (!sta.empty())  
  95.         {  
  96.             p = sta.top();    
  97.             cout << p->data << " ";  //访问栈顶元素,  
  98.             sta.pop();     //栈顶元素出栈  
  99.             p = p->rchild;  //向右一步     
  100.             if (NULL != p)  
  101.             {  
  102.                 sta.push(p);  
  103.             }  
  104.         }         
  105.     }  
  106. }  
  107. /************************************************************************ 
  108. 方法:先序遍历(非递归形式) 
  109. 思想:向左走到尽头,入栈,访问节点。出栈,向右一步 
  110. ************************************************************************/  
  111. template<class T>  
  112. void BiTree<T>::PreOrderTraverse()  
  113. {  
  114.     stack<BiNode<T>*> sta;  
  115.     BiNode<T>* p = root;  
  116.     sta.push(p);   //将根指针入栈  
  117.     while(!sta.empty())  
  118.     {  
  119.         while (NULL != p)  
  120.         {//向左走到尽头,并保留所经过的节点指针,入栈  
  121.             cout << p->data << " ";  
  122.             p = p->lchild;   
  123.             if (NULL != p)  
  124.             {  
  125.                 sta.push(p);  
  126.             }     
  127.         }  
  128.   
  129.         if (!sta.empty())  
  130.         {  
  131.             p = sta.top();    
  132.             sta.pop();     //栈顶元素出栈  
  133.             p = p->rchild;  //向右一步     
  134.             if (NULL != p)  
  135.             {  
  136.                 sta.push(p);  
  137.             }  
  138.         }         
  139.     }  
  140. }  
  141.   
  142. /************************************************************************ 
  143.  后序遍历(非递归形式)                                                
  144.  思想:从根节点开始,向左走到尽头,并入栈,同时设置标志位为1. 
  145.  出栈时如果这个节点有右子树,则判断是第几次访问,如果是第1次访问, 
  146.  则不出栈,将标志位改为2;如果是第二次访问,则出栈。 
  147.                                                 
  148. ************************************************************************/  
  149. template<class T>  
  150. void BiTree<T>::PostOrderTraverse()  
  151. {  
  152.     stack<BiNode<T>*> sta; //存放节点指针的栈  
  153.     stack<int> flagsta;  //存放标志位的栈,每出(入)一个节点指针,同步出(入)一个标志位  
  154.     unsigned flag;  //设置标志位,1-第一次访问,2-第二次访问  
  155.     BiNode<T>* p = root;  
  156.     sta.push(p);   //将根指针入栈  
  157.     flagsta.push(1);  
  158.     while(!sta.empty())  
  159.     {  
  160.         while (NULL != p && NULL != p->lchild)  
  161.         {//向左走到尽头,并保留所经过的节点指针,入栈  
  162.             p = p->lchild;   
  163.             sta.push(p);  
  164.             flagsta.push(1);  
  165.         }  
  166.   
  167.         if (!sta.empty())  
  168.         {  
  169.             flag = flagsta.top();  
  170.             flagsta.pop();  
  171.             p = sta.top();  
  172.   
  173.             if ((NULL != p->rchild) && flag == 1 )  
  174.             {//如果右子树不空,且是第一次访问  
  175.                 flagsta.push(2);      //第一次访问时元素不出栈,但将标志位设置为2     
  176.                 p = p->rchild;    //向右一步  
  177.                 sta.push(p);  
  178.                 flagsta.push(1);  
  179.             }  
  180.             else  
  181.             {  
  182.                 sta.pop(); //元素出栈  
  183.                 cout << p->data << " ";  //访问栈顶元素  
  184.                 p = NULL; //将指针置为空  
  185.             }         
  186.         }         
  187.     }  
  188. }  
[cpp] view plaincopy
  1. //测试程序  
  2. void main()  
  3. {   
  4.     BiTree<int> a;  
  5.     cout << "The InOrderTraverse is: " ;  
  6.     a.InOrderTraverse();  
  7.     cout << endl;  
  8.   
  9.     cout << "The PreOrderTraverse is: " ;  
  10.     a.PreOrderTraverse();  
  11.     cout << endl;  
  12.   
  13.     cout << "The PostOrderTraverse is: " ;  
  14.     a.PostOrderTraverse();  
  15.     cout << endl;  
  16. }  


当在键盘上一次输入3,2,5,0,0,4,0,0,6,0,0,(这里逗号代表实际输入时的回车键),即构造了二叉树

          3

     2      6

5     4

输出:

root=3
The InOrderTraverse is: 5 2 4 3 6
The PreOrderTraverse is: 3 2 5 4 6
The PostOrderTraverse is: 5 4 2 6 3

达到预期效果。

0 0
原创粉丝点击