zoukankan      html  css  js  c++  java
  • 二叉树

    binaryTree.h

      1 #ifndef BINARYTREE_H
      2 #define BINARYTREE_H
      3 
      4 #include<iostream>
      5 using namespace std;
      6 
      7 #include<cstdlib>
      8 #include<stack>
      9 #include<queue>
     10 
     11 enum Status{ERROR,OK};//定义状态枚举时还得注意实际的值,不能搞错了
     12 
     13 template<class T>
     14 Status PrintElement(T e)
     15 {
     16     cout<<e<<" ";
     17     return OK;
     18 }
     19 
     20 template<class T>
     21 class BiNode//树节点
     22 {
     23 public:
     24     BiNode();
     25     T data;
     26     BiNode *left;
     27     BiNode *right;
     28 };
     29 
     30 template<class T>
     31 BiNode<T>::BiNode()
     32 {
     33     data = (T)0;
     34     left = NULL;
     35     right = NULL;//有时候你初始化指针值为NULL,你也没有在后面的语句中刻意去改变该指针值,但指针的值还是可能因为传递到函数作为参数而发生改变,因此如果你要再重新用指针的NULL值,最好在用之前显示地再重新赋值一下才行
     36 }
     37 
     38 template<class T>
     39 class BiTree
     40 {
     41 public:
     42     BiTree();
     43     Status CreateBiTree(BiNode<T> *&root);
     44     Status PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,递归方法
     45     Status NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//前序遍历,非递归方法
     46     Status InOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,递归方法
     47     Status NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//中序遍历,非递归方法
     48     Status PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,递归方法
     49     Status NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element));//后序遍历,非递归方法
     50     Status LevelTraverse(BiNode<T> *r,Status (*visit)(T element));//层次遍历
     51     Status BiTraverse();
     52     ~BiTree();
     53 
     54 private:
     55     BiNode<T> *root;//树根节点
     56 };
     57 
     58 template<class T>
     59 BiTree<T>::BiTree()
     60 {
     61     CreateBiTree(root);
     62 }
     63 
     64 template<class T>
     65 Status BiTree<T>::CreateBiTree(BiNode<T> *&r)//这里即使是指针也得加&符号,这样才能真正修改root,不然修改不了(还认为是值传递)
     66 {
     67     r = NULL;
     68     T ch;
     69     cin>>ch;
     70     if(ch != (T)0)
     71     {
     72         r = new BiNode<T>();
     73         if(r != NULL)
     74         {
     75             r->data = ch;
     76             CreateBiTree(r->left);
     77             CreateBiTree(r->right);
     78         }
     79     }
     80     else
     81     {
     82         r = NULL;
     83         //r = new BiNode<T>();
     84         //r->data = (T)0;//这里的左右孩子不存在的节点我们规定其data值为0,方便后面遍历时进行判断,不为0则输出并继续递归,为0则直接返回
     85     }
     86     return OK;
     87 }
     88 
     89 template<class T>
     90 Status BiTree<T>::PreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历递归方法
     91 {
     92     if(r != NULL)
     93     {
     94         if((*visit)(r->data))
     95         {
     96             if(PreOrderTraverse(r->left,visit))
     97             {
     98                 if(PreOrderTraverse(r->right,visit))
     99                 {
    100                     return OK;
    101                 }
    102             }
    103         }
    104         return ERROR;
    105     }
    106     else
    107     {
    108         return OK;
    109     }
    110 }
    111 
    112 template<class T>
    113 Status BiTree<T>::NPreOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//前序遍历非递归方法(栈)
    114 {
    115     stack<BiNode<T> *>s;
    116     BiNode<T> *temp = r;
    117 
    118     while(true)
    119     {
    120         while(temp != NULL)
    121         {
    122             if(temp->right != NULL)
    123             {
    124                 s.push(temp->right);
    125             }
    126             visit(temp->data);
    127             temp = temp->left;
    128         }
    129         if(!s.empty())
    130         {
    131             temp = s.top();
    132             s.pop();
    133         }
    134         else
    135         {
    136             break;
    137         }
    138     }
    139     return OK;
    140 }
    141 
    142 template<class T>
    143 Status BiTree<T>::InOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,递归方法
    144 {
    145     if(r != NULL)
    146     {
    147         if(InOrderTraverse(r->left,visit))
    148         {
    149             if((*visit)(r->data))
    150             {
    151                 if(InOrderTraverse(r->right,visit))
    152                 {
    153                     return OK;
    154                 }
    155             }
    156         }
    157         return ERROR;
    158     }
    159     else
    160     {
    161         return OK;
    162     }
    163 
    164     return OK;
    165 }
    166 
    167 template<class T>
    168 Status BiTree<T>::NInOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//中序遍历,非递归方法(栈)
    169 {
    170     stack<BiNode<T> *> s;
    171     BiNode<T> *temp;
    172     s.push(r);
    173     while(!s.empty())
    174     {
    175         while((temp = (BiNode<T> *)s.top()) && temp != NULL)
    176         {
    177             s.push(temp->left);
    178         }
    179         s.pop();
    180         if(!s.empty())
    181         {
    182             temp = s.top();
    183             visit(temp->data);
    184             s.pop();
    185             s.push(temp->right);
    186         }
    187     }
    188 
    189     return OK;
    190 }
    191 
    192 template<class T>
    193 Status BiTree<T>::PostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历递归算法
    194 {
    195     if(r != NULL)
    196     {
    197         if(PostOrderTraverse(r->left,visit))
    198         {
    199             if(PostOrderTraverse(r->right,visit))
    200             {
    201                 if((*visit)(r->data))
    202                 {
    203                     return OK;
    204                 }
    205             }
    206         }
    207         return ERROR;
    208     }
    209     else
    210     {
    211         return OK;
    212     }
    213 
    214     return OK;
    215 }
    216 
    217 template<class T>
    218 Status BiTree<T>::NPostOrderTraverse(BiNode<T> *r,Status (*visit)(T element))//后序遍历非递归算法(栈)
    219 {
    220     stack<BiNode<T> *> s;
    221     BiNode<T> *temp = r;//这里要赋初值不能忘了
    222     s.push(temp);
    223     while(!s.empty())//任何时候都必须要判定是否为空
    224     {
    225         while((temp = s.top())&&temp)
    226         {
    227             s.push(temp->left);
    228         }
    229         s.pop();
    230         if(!s.empty())
    231         {
    232             while(temp == (s.top())->right || (temp == (s.top())->left) && ((s.top())->right == NULL))
    233             {
    234                 temp = s.top();
    235                 visit(temp->data);
    236                 s.pop();
    237                 if(s.empty())//这里是条件一定要判断准确了,是empty()而不是!empty()
    238                 {
    239                     break;
    240                 }
    241             }
    242             if(!s.empty())
    243             {
    244                 temp = s.top();
    245                 s.push(temp->right);
    246             }
    247         }
    248         else
    249         {
    250             break;
    251         }
    252     }
    253 
    254     return OK;
    255 }
    256 
    257 template<class T>
    258 Status BiTree<T>::LevelTraverse(BiNode<T> *r,Status (*visit)(T element))
    259 {
    260     queue<BiNode<T> *> qu;
    261     BiNode<T> *temp;
    262     if(!r)
    263     {
    264         qu.push(r);
    265         while(!qu.empty())
    266         {
    267             temp = qu.front();
    268             visit(temp->data);
    269             if(temp->left)
    270             {
    271                 qu.push(temp->left);
    272             }
    273             if(temp->right)
    274             {
    275                 qu.push(temp->right);
    276             }
    277             qu.pop();
    278         }
    279     }
    280 
    281     return OK;
    282 }
    283 
    284 template<class T>
    285 Status BiTree<T>::BiTraverse()
    286 {
    287     cout<<"Recursive traverse:"<<endl;
    288 
    289     cout<<"preorder traverse :"<<endl;
    290     PreOrderTraverse(root,PrintElement);
    291 
    292     cout<<endl<<"inorder traverse :"<<endl;
    293     InOrderTraverse(root,PrintElement);
    294 
    295     cout<<endl<<"postorder traverse :"<<endl;
    296     PostOrderTraverse(root,PrintElement);
    297 
    298     cout<<endl<<"Non-recursive traverse:"<<endl;
    299 
    300     cout<<endl<<"NPreorder traverse:"<<endl;
    301     NPreOrderTraverse(root,PrintElement);
    302     
    303     cout<<endl<<"NInorder treaverse:"<<endl;
    304     NInOrderTraverse(root,PrintElement);
    305 
    306     cout<<endl<<"NPostorder traverse:"<<endl;
    307     NPostOrderTraverse(root,PrintElement);
    308     
    309     cout<<endl<<"Level traverse:"<<endl;
    310     LevelTraverse(root,PrintElement);
    311 
    312     return OK;
    313 }
    314 
    315 template<class T>
    316 BiTree<T>::~BiTree()//最后在析构函数里使用中序非递归遍历算法进行树节点遍历进而释放内存空间
    317 {
    318     stack<BiNode<T> *> s;
    319     BiNode<T> *temp;
    320     s.push(r);
    321     while(!s.empty())
    322     {
    323         while((temp = (BiNode<T> *)s.top()) && temp != NULL)
    324         {
    325             s.push(temp->left);
    326         }
    327         s.pop();
    328         if(!s.empty())
    329         {
    330             temp = s.top();
    331             delete temp;
    332             s.pop();
    333             s.push(temp->right);
    334         }
    335     }
    336 }
    337 
    338 #endif

    main.cpp

     1 #include<iostream>
     2 
     3 using namespace std;
     4 #include<stdlib.h>
     5 #include"binaryTree.h"
     6 
     7 int main()
     8 {
     9     cout<<"please input a series number to create a binarytree :"<<endl;
    10     BiTree<int> *t1 = new BiTree<int>();//new永远是返回指针
    11 
    12     t1->BiTraverse();
    13 
    14 
    15     system("pause");
    16     return 0;
    17 }
  • 相关阅读:
    安装docker
    docker安装完成后测试feisky/nginx:latest 出现问题(Unable to find image 'feisky/nginx:latest' locally)
    负载均衡详细介绍
    docker(一)
    AppCrawer使用(2)
    AppCrawer使用入门(转自https://www.cnblogs.com/alwayswyy/p/7576964.html,感谢原作者)
    获取包名和活动名
    (十八)Collection集合
    (十七)面向对象之内部类
    (十五)final关键字
  • 原文地址:https://www.cnblogs.com/maowang1991/p/2806307.html
Copyright © 2011-2022 走看看