zoukankan      html  css  js  c++  java
  • 查找树--C++实现

      1 #ifndef BSTREE_H
      2 #define BSTREE_H
      3 
      4 #include <iostream>
      5 
      6 template <typename T>
      7 class BSTreeNode {
      8 public:
      9     T key;
     10     BSTreeNode *left;
     11     BSTreeNode *right;
     12     BSTreeNode *parent;
     13     BSTreeNode(T value, BSTreeNode *p, BSTreeNode *l, BSTreeNode *r)
     14         : key(value), parent(p), left(l), right(r) {}
     15 
     16     T operator*() const { return key; }
     17 };
     18 
     19 template <typename T>
     20 class BSTree
     21 {
     22 public:
     23     typedef BSTreeNode<T> Node;
     24     typedef BSTreeNode<T>* Node_pointer;
     25 
     26 public:
     27     BSTree();
     28     ~BSTree();
     29 
     30     //前序遍历
     31     void preOrder() { preOrder(rootTree); }
     32     //中序遍历
     33     void inOrder() { inOrder(rootTree); }
     34     //后序遍历
     35     void postOrder() { postOrder(rootTree); }
     36     //最大值
     37     T max();
     38     //最小值
     39     T min();
     40     // 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。
     41     Node* successor(Node *x);
     42     // 找结点(x)的前驱结点。即,查找"二叉树中数据值小于该结点"的"最大结点"。
     43     Node* predecessor(Node *x);
     44     // (递归实现)查找"二叉树"中键值为key的节点
     45     Node* search(T key);
     46     //插入
     47     void insert(T key);
     48     //删除
     49     void remove(T key);
     50     
     51     //清除
     52     void clear();
     53 private:
     54     void insert(Node_pointer &tree, Node *z);
     55     Node* remove(Node_pointer &tree, Node *z);
     56 
     57     void preOrder(Node *tree);
     58     void inOrder(Node *tree);
     59     void postOrder(Node *tree);
     60     Node* max(Node *tree);
     61     Node* min(Node *tree);
     62     Node* search(Node* tree, T key);
     63     void destroy(Node_pointer &tree);
     64 private:
     65     Node *rootTree;
     66 };
     67 
     68 template <typename T>
     69 BSTree<T>::BSTree() : rootTree(nullptr)
     70 {
     71 }
     72 
     73 template <typename T>
     74 BSTree<T>::~BSTree()
     75 {
     76     clear();
     77 }
     78 
     79 template <typename T>
     80 void BSTree<T>::insert(T key)
     81 {
     82     Node* z = new Node(key, nullptr, nullptr, nullptr);
     83     insert(rootTree, z);
     84 }
     85 
     86 template <typename T>
     87 void BSTree<T>::insert(Node_pointer &tree, Node *z)
     88 {
     89     Node* y = nullptr;
     90     Node* x = tree;
     91 
     92     while (x != nullptr) {
     93         y = x;
     94         if (z->key < x->key) {
     95             x = x->left;
     96         }
     97         else {
     98             x = x->right;
     99         }
    100     }
    101 
    102     z->parent = y;
    103     if (y == nullptr) {
    104         tree = z;
    105     }
    106     else if (z->key < y->key) {
    107         y->left = z;
    108     }
    109     else {
    110         y->right = z;
    111     }
    112 }
    113 
    114 
    115 template <typename T>
    116 void BSTree<T>::preOrder(Node *tree)
    117 {
    118     if (tree == nullptr) return;
    119     std::cout << tree->key << " ";
    120     preOrder(tree->left);
    121     preOrder(tree->right);
    122 }
    123 
    124 template <typename T>
    125 void BSTree<T>::inOrder(Node *tree)
    126 {
    127     if (!tree) return;
    128     inOrder(tree->left);
    129     std::cout << tree->key << " ";
    130     inOrder(tree->right);
    131 }
    132 
    133 template <typename T>
    134 void BSTree<T>::postOrder(Node *tree)
    135 {
    136     if (!tree) return;
    137     postOrder(tree->left);
    138     postOrder(tree->right);
    139     std::cout << tree->key << " ";
    140 }
    141 
    142 template <typename T>
    143 void BSTree<T>::clear()
    144 {
    145     std::cout << "===destroy: ";
    146     destroy(rootTree);
    147     std::cout << std::endl;
    148 }
    149 
    150 template <typename T>
    151 void BSTree<T>::destroy(Node_pointer &tree)
    152 {
    153     if (tree == nullptr) return;
    154 
    155     if (tree->left) {
    156         destroy(tree->left);
    157     }
    158     if (tree->right) {
    159         destroy(tree->right);
    160     }
    161 
    162     std::cout << tree->key << " ";
    163     delete tree;
    164     tree = nullptr;
    165 }
    166 
    167 template <typename T>
    168 typename BSTree<T>::Node*  BSTree<T>::max(Node *tree)
    169 {
    170     if (!tree) return nullptr;
    171 
    172     Node* x = tree;
    173     while (x->right) {
    174         x = x->right;
    175     }
    176     return x;
    177 }
    178 
    179 template <typename T>
    180 T BSTree<T>::max()
    181 {
    182     Node* x = max(rootTree);
    183     
    184     if (x) {
    185         return x->key;
    186     } else {
    187         return (T)nullptr;
    188     }
    189         
    190 }
    191 
    192 template <typename T>
    193 typename BSTree<T>::Node* BSTree<T>::min(Node *tree)
    194 {
    195     if (!tree) return nullptr;
    196 
    197     Node* x = tree;
    198     while (x->left) {
    199         x = x->left;
    200     }
    201     return x;
    202 }
    203 
    204 template <typename T>
    205 T BSTree<T>::min()
    206 {
    207     Node* x = min(rootTree);
    208 
    209     if (x) {
    210         return x->key;
    211     } else {
    212         return (T)nullptr;
    213     }
    214 }
    215 
    216 // 找结点(x)的后继结点。即,查找"二叉树中数据值大于该结点"的"最小结点"。
    217 template <typename T>
    218 typename BSTree<T>::Node* BSTree<T>::successor(Node *x)
    219 {
    220     if (!x) return nullptr;
    221 
    222     if (x->right) {
    223         return min(x->right);
    224     } 
    225 
    226     //1. x为一个左节点,父节点为后驱
    227     //2. x为一个右节点,寻找父节点的父节点。。。,直到找到一个自己作为左孩子的父节点。
    228     Node* y = x->parent;
    229     while ((y!=nullptr) && (x==y->right)) {
    230         x = y;
    231         y = x->parent;
    232     }
    233 
    234     return y;
    235 }
    236 
    237 // 找结点(x)的前驱结点。即,查找"二叉树中数据值小于该结点"的"最大结点"。
    238 template <typename T>
    239 typename BSTree<T>::Node* BSTree<T>::predecessor(Node *x)
    240 {
    241     if (!x) return nullptr;
    242 
    243     if (x->left) {
    244         return max(x->left);
    245     }
    246 
    247     //1. x为一个右节点,父节点为后驱
    248     //2. x为一个左节点,寻找父节点的父节点。。。,直到找到一个自己作为右孩子的父节点。
    249     Node* y = x->parent;
    250     while ((y != nullptr) && (x == y->left)) {
    251         x = y;
    252         y = x->parent;
    253     }
    254 
    255     return y;
    256 
    257 }
    258 
    259 template <typename T>
    260 typename BSTree<T>::Node* BSTree<T>::remove(Node_pointer &tree, Node *z)
    261 {
    262     Node* x = nullptr;
    263     Node* y = nullptr; //删除的节点
    264 
    265     //1. 假如z只含有一个子节点或者无子节点,删除z节点
    266     //2. 假如z含有两个子节点,则删除后驱节点,然后z节点值替换
    267     //y最多一个孩子节点
    268     if ((z->left == nullptr) || (z->right == nullptr)) {
    269         y = z;
    270     } else {
    271         y = successor(z);
    272     }
    273 
    274     //查找子节点
    275     if (y->left != nullptr) {
    276         x = y->left;
    277     } else {
    278         x = y->right;
    279     }
    280 
    281     if (x != nullptr) {
    282         x->parent = y->parent;
    283     }
    284 
    285     if (y->parent == nullptr) {
    286         tree = x;
    287     } 
    288     else if (y == y->parent->left) {
    289         y->parent->left = x;
    290     }
    291     else {
    292         y->parent->right = x;
    293     }
    294 
    295     return y;
    296 }
    297 
    298 //删除
    299 template <typename T>
    300 void BSTree<T>::remove(T key)
    301 {
    302     Node* x = search(key);
    303     if (!x) return;
    304 
    305     Node* y = remove(rootTree, x);
    306     if (y) {
    307         delete y;
    308     }
    309 }
    310 
    311 template <typename T>
    312 typename BSTree<T>::Node* BSTree<T>::search(Node* tree, T key)
    313 {
    314 
    315     if (tree==nullptr || tree->key == key) {
    316         return tree;
    317     }
    318 
    319     if (key < tree->key) {
    320         return search(tree->left, key);
    321     } else {
    322         return search(tree->right, key);
    323     }
    324 }
    325 
    326 template <typename T>
    327 typename BSTree<T>::Node* BSTree<T>::search(T key)
    328 {
    329     return search(rootTree, key);
    330 }
    331 
    332 #endif
  • 相关阅读:
    JavaScript中的的面向对象中的一些知识
    JavaScript中的Function
    jq 表格全选案例
    jq 美女相册案例
    jq 属性操作
    jq tab图片切换
    jq class操作
    jq css操作
    jquery 淘宝案例
    jquery 鼠标点击下滑案例
  • 原文地址:https://www.cnblogs.com/vczf/p/12104051.html
Copyright © 2011-2022 走看看