二分搜索树

一、二分搜索树的查找

 

二、二分搜索树的遍历(深度遍历<前、中、后>,广度遍历)

#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>

using namespace std;

template <typename Key, typename Value>
class BST {
 private:
  struct Node {
    Key key;
    Value value;
    Node* left;
    Node* right;

    Node(Key key, Value value) {
      this->key = key;
      this->value = value;
      this->left = this->right = NULL;
    }
  };

  Node* root;
  int count;

  Node* insert(Node* node, Key key, Value value) {
    if (node == NULL) {
      count++;
      return new Node(key, value);
    }

    if (key == node->key)
      node->value = value;
    else if (key < node->key)
      node->left = insert(node->left, key, value);
    else
      node->right = insert(node->right, key, value);

          return node;
  }

  bool contain(Node* node, Key key) {
    if (node == NULL) return false;

    if (key == node->key)
      return true;
    else if (key < node->key)
      return contain(node->left, key);
    else
      return contain(node->right, key);
  }

  Value* search(Node* node, Key key) {
    if (node == NULL) return NULL;

    if (key == node->key)
      return &(node->value);
    else if (key < node->key)
      return search(node->left, key);
    else
      return search(node - right, key);
  }
  //前序遍历
  void preoder(Node* node) {
    if (node != NULL) {
      cout << node->key << endl;
      preoder(node->left);
      preoder(node->right);
    }
  }
  //中序遍历
  void inoder(Node* node) {
    if (node != NULL) {
      inoder(node->left);
      cout << node->key << endl;
      inoder(node -> right);
    }
  }
  //后序遍历
  void postoder(Node* node) {
    if (node != NULL) {
      postoder(node->left);
      postoder(node->right);
      cout << node->key << endl;
    }
  }
  //释放空间
  void destory(Node* node) {
    if (node != NULL) {
      destory(node->left);
      destory(node->right);

      delete node;
      count--;
    }
  }

 public:
  BST() {
    root = NULL;
    count = 0;
  }

  ~BST() { destory(root); }

  int size() { return count; }

  int isEmpty() { return count == 0; }

  int insert(Key key, Value value) { root = insert(root, key, value); }

  bool contain(Key key) { return contain(root, key); }

  Value* search(Key key) { return search(root, key); }

  void preoder() { preoder(root); }

  void inoder() { inoder(root); }

  void postoder()  { postoder(root); }
  // 层序遍历
  void leveloder(){
      
      queue<Node*> q;
      q.push(root);

      while(!q.empty()){
          Node *node = q.front();
          q.pop();

          cout<<node->key<<endl;

           if(node->left)
              q.push(node->left);
           if(node->right)
              q.push(node->right);

      }
  }
};

int main() {
  srand(time(NULL));
  BST<int, int> bst = BST<int, int>();

  int N = 10, M = 100;
  for (int i = 0; i < N; i++) {
    int key = rand() % M;
    int value = key;
    cout << key << " ";
    bst.insert(key, value);
  }
  cout << endl;

  cout << "szie:" << bst.size() << endl;

  cout << "preoder:" << endl;
  bst.preoder();
  cout << endl;

  cout << "inoder:" << endl;
  bst.inoder();
  cout << endl;

  cout << "postoder:" << endl;
  bst.postoder();
  cout << endl;
  
  cout << "leveloder:" << endl;
  bst.leveloder();
  cout << endl;

  return 0;
}

三、二分搜索树删除最大值最小值

 

四、

 

五、

 

posted @ 2019-10-22 11:28  codeg  阅读(167)  评论(0编辑  收藏  举报