zoukankan      html  css  js  c++  java
  • 二叉查找树(Binary Search Tree)

      1 #ifndef BSTREE_H
      2 #define BSTREE_H
      3 #include<cassert>
      4 #include<stack>
      5 using namespace std;
      6 
      7 template<typename T>
      8 class BSTree
      9 {
     10 public:
     11     template<typename T>
     12     struct Node{
     13         T data;
     14         Node* lchild;
     15         Node* rchild;
     16         Node* parent;
     17 
     18         Node(T d):data(d),lchild(0),rchild(0),parent(0){}
     19         Node(T d,Node*l,Node* r,Node* p):data(d),lchild(l),rchild(r),parent(p){}
     20     };
     21 private:
     22     Node<T>* _root;
     23 
     24     void clear(Node<T>* p){
     25         if(!p)
     26             return;
     27         clear(p->lchild);
     28         clear(p->rchild);
     29         delete p;
     30     }
     31 
     32     Node<T>* search(Node<T>* p,T key){
     33         if(!p||key==p->data)
     34             return p;
     35         if(key<p->data)
     36             return search(p->lchild,key);
     37         else
     38             return search(p->rchild,key);
     39     }
     40 
     41     Node<T>* iterativeSearch(Node<T>* p,T key){
     42         while(p&&p->data!=key){
     43             if(key < p->data)
     44                 p=p->lchild;
     45             else
     46                 p=p->rchild;
     47         }
     48         return p;
     49     }
     50 public:
     51     Node<T>* getRoot(){
     52         return _root;
     53     }
     54 
     55     BSTree(void)
     56     {
     57         _root=0;
     58     }
     59 
     60     ~BSTree(void)
     61     {
     62         clear(_root);
     63     }
     64 
     65     static void preorderTraversal(Node<T>* p){
     66         if(!p)
     67             return;
     68         cout<<p->data<<' ';
     69         preorderTraversal(p->lchild);
     70         preorderTraversal(p->rchild);
     71     }
     72 
     73     static void recursivePreorderTraversal(Node<T>* p){
     74         assert(p!=0);
     75 
     76         stack<Node<T>*> s;
     77         s.push(p);
     78         while(!s.empty()){
     79             Node<T>* cur=s.top();
     80             s.pop();
     81             if(cur){
     82                 cout<<cur->data<<' ';
     83                 if(cur->rchild)
     84                     s.push(cur->rchild);
     85                 if(cur->lchild)
     86                     s.push(cur->lchild);    
     87             }
     88         }
     89     }
     90 
     91     static void inorderTraversal(Node<T>* p){
     92         if(!p)
     93             return;
     94 
     95         inorderTraversal(p->lchild);
     96         cout<<p->data<<' ';
     97         inorderTraversal(p->rchild);
     98     }
     99 
    100     static void recursiveInorderTraversal(Node<T>* p){
    101         assert(p!=0);
    102 
    103         stack<Node<T>*> s;
    104         while(p||!s.empty()){
    105             if(p){
    106                 s.push(p);
    107                 p=p->lchild;
    108             }
    109             else{
    110                 p=s.top();
    111                 s.pop();
    112                 cout<<p->data<<' ';
    113                 p=p->rchild;
    114             }
    115         }
    116     }
    117 
    118     static void postorderTraversal(Node<T>* p){
    119         if(!p)
    120             return;
    121         postorderTraversal(p->lchild);
    122         postorderTraversal(p->rchild);
    123         cout<<p->data<<' ';
    124     }

     1 static void levelTraversal(Node<T>* root){
     2         if(!root)
     3             return;
     4 
     5         queue<Node<T>*> q;
     6         q.push(root);
     7         while(!q.empty()){
     8             Node<T>*cur=q.front();
     9             cout<<cur->data<<' ';
    10             q.pop();
    11             if(cur->lchild)
    12                 q.push(cur->lchild);
    13             if(cur->rchild)
    14                 q.push(cur->rchild);
    15         }
    16         cout<<endl;
    17     }
    18 
    19     static int printNodeAtLevel(Node<T>* root,int level){
    20         if(!root||level<0)
    21             return 0;
    22         if(level==0){
    23             cout<<root->data<<' ';
    24             return 1;
    25         }
    26         else{//level>0
    27             return printNodeAtLevel(root->lchild,level-1)+printNodeAtLevel(root->rchild,level-1);
    28         }
    29     }
    30 
    31     static void printNodeByLevel(Node<T>* root){
    32         int level=0;
    33         while(printNodeAtLevel(root,level++)){
    34             cout<<endl;
    35         }
    36     }
    37 
    38     static void printNodeByLevel2(Node<T>* root){
    39         if(!root)
    40             return;
    41         vector<Node<T>*> vec;
    42         vec.push_back(root);
    43         int cur=0,last=1;
    44         while(cur<vec.size()){
    45             while(cur<last){
    46                 cout<<vec[cur]->data<<' ';
    47                 if(vec[cur]->lchild)
    48                     vec.push_back(vec[cur]->lchild);
    49                 if(vec[cur]->rchild)
    50                     vec.push_back(vec[cur]->rchild);
    51                 cur++;
    52             }
    53             cout<<endl;
    54             last=vec.size();
    55         }
    56     }
    
    
    125 
    126     void insert(Node<T>* newNode){
    127         Node<T>* p=0;
    128         Node<T>* cur=_root;
    129         while(cur){
    130             p=cur;
    131             if(newNode->data < cur->data)
    132                 cur=cur->lchild;
    133             else
    134                 cur=cur->rchild;
    135         }
    136         newNode->parent=p;
    137         if(!p){
    138             _root=newNode;
    139         }
    140         else{
    141             if(newNode->data < p->data)
    142                 p->lchild=newNode;
    143             else
    144                 p->rchild=newNode;
    145         }
    146     }
    147 
    148     void insert(T data){
    149         Node<T>* newNode=new Node<T>(data);
    150         insert(newNode);
    151     }
    152 
    153     Node<T>* search(T key){
    154         return search(_root,key);
    155     }
    156 
    157     Node<T>* minimum(Node<T>* p){
    158         /*recursive version
    159         if(!p)
    160         return 0;
    161         if(p->lchild)
    162         return minimum(p->lchild);
    163         else
    164         return p;*/
    165 
    166         if(p){
    167             while(p->lchild){
    168                 p=p->lchild;
    169             }
    170         }
    171         return p;    
    172     }
    173     Node<T>* minimum(){
    174         return minimum(_root);
    175     }
    176 
    177     Node<T>* maximum(Node<T>*p){
    178         /*recursive version
    179         if(!p)
    180         return 0;
    181         if(!p->rchild)
    182         return p;
    183         else
    184         return maximum(p->rchild);*/
    185 
    186         if(p){
    187             while(p->rchild){
    188                 p=p->rchild;
    189             }
    190         }
    191         return p;
    192     }
    193 
    194     Node<T>* maximum(){
    195         return maximum(_root);
    196     }
    197 
    198     Node<T>* successor(Node<T>* cur){
    199         assert(cur!=0);
    200         if(cur->rchild){
    201             return minimum(cur->rchild);
    202         }
    203         else{
    204             Node<T>* p=cur->parent;
    205             while(p && p->rchild==cur){
    206                 cur=p;
    207                 p=p->parent;
    208             }
    209             return p;
    210         }
    211     }
    212 
    213     Node<T>* predecessor(Node<T>* cur){
    214         assert(cur!=0);
    215         if(cur->lchild){
    216             return maximum(cur->lchild);
    217         }
    218         else{
    219             Node<T>* p=cur->parent;
    220             while(p&&p->lchild==cur){
    221                 cur=p;
    222                 p=p->parent;
    223             }
    224             return p;
    225         }
    226     }
    227 
    228     Node<T>* findLowestCommonAncestor(Node<T>* p,Node<T>* child1,Node<T>* child2){
    229         if(!p||!child1||!child2)
    230             return 0;
    231 
    232         while(p){
    233             T pd=p->data;
    234             T cd1=child1->data;
    235             T cd2=child2->data;
    236             if(pd>cd1&&pd>cd2)
    237                 p=p->lchild;
    238             else if(pd<cd1&&pd<cd2)
    239                 p=p->rchild;
    240             else
    241                 return p;
    242         }
    243         return 0;
    244     }
    245 
    246     Node<T>* remove(Node<T>* cur){
    247         Node<T>* deleted=0;
    248         if(!cur->lchild||!cur->rchild)
    249             deleted=cur;
    250         else
    251             deleted=successor(cur);
    252 
    253         Node<T>* child=0;
    254         if(deleted->lchild)
    255             child=deleted->lchild;
    256         else
    257             child=deleted->rchild;
    258         Node<T>* parent=deleted->parent;
    259         if(child)
    260             child->parent=parent;
    261 
    262         if(!parent)
    263             _root=child;
    264         else if(deleted==parent->lchild)
    265             parent->lchild=child;
    266         else
    267             parent->rchild=child;
    268 
    269         if(cur!=deleted){
    270             T tmp=cur->data;
    271             cur->data=deleted->data;
    272             deleted->data=tmp;
    273         }
    274 
    275         return deleted;
    276     }
    //二叉树镜像转换
    1
    static void mirror(Node<T>* root){ 2 if(!root||(!root->lchild&&!root->rchild)) 3 return; 4 5 mirror(root->lchild); 6 mirror(root->rchild); 7 swap(root->lchild,root->rchild); 8 } 9 10 static void mirror2(Node<T>* root){ 11 if(!root||(!root->lchild&&!root->rchild)) 12 return; 13 14 swap(root->lchild,root->rchild); 15 mirror(root->lchild); 16 mirror(root->rchild); 17 } 18 19 static void mirrorIterative(Node<T>* root){ 20 if(!root) 21 return; 22 stack<Node<T>*> s; 23 s.push(root); 24 while(!s.empty()){ 25 Node<T>*cur=s.top(); 26 s.pop(); 27 swap(cur->lchild,cur->rchild); 28 if(cur->lchild) 29 s.push(cur->lchild); 30 if(cur->rchild) 31 s.push(cur->rchild); 32 } 33 }
    
    
    
    277 };
    278 
    279 #endif//BSTREE_H
  • 相关阅读:
    [译]git reflog
    [译]git rebase -i
    [译]git rebase
    [译]git commit --amend
    [译]git clean
    [译]git reset
    [译]git revert
    [译]git checkout
    [译]git log
    [译]git status
  • 原文地址:https://www.cnblogs.com/freewater/p/2558733.html
Copyright © 2011-2022 走看看