BinarySearchTree

#include <iostream>
#include <cstdlib>

template<typename E, typename K>
struct BSTNode {
  E data;
  BSTNode<E, K> *left, *right;
  BSTNode(): left(NULL), right(NULL) {}
  BSTNode(const E d, BSTNode<E, K> *l = NULL, BSTNode<E, K> *r = NULL)
    : data(d), left(l), right(r) {}
  ~BSTNode() {}
  void set_data(E d) { data = d; }
  E get_data() { return data; }
};

template<typename E, class K>
class BSTree {
public:
  BSTree(): root(NULL) {}
  BSTree(K value);
  ~BSTree() {}
  bool search(const K x) const {
    return (search(x, root) != NULL);
  }
  BSTree<E, K>& operator=(const BSTree<E, K>& t);
  void make_empty() {
    make_empty(root);
    root = NULL;
  }
  void print_tree() const { print_tree(root); }
  E min() { return min(root)->data; }
  E max() { return max(root)->data; }
  bool insert(const E& e) { return insert(e, root); }
  bool remove(const K x) { return remove(x, root); }
private:
  BSTNode<E, K> *root;
  K refvalue;
  BSTNode<E, K> *search(const K x, BSTNode<E, K> *ptr);
  void make_empty(BSTNode<E, K> *& ptr);
  void print_tree(BSTNode<E, K> *ptr) const;
  BSTNode<E, K> *copy(const BSTNode<E, K> *ptr);
  BSTNode<E, K> *min(BSTNode<E, K> *ptr) const;
  BSTNode<E, K> *max(BSTNode<E, K> *ptr) const;
  bool insert(const E& e, BSTNode<E, K> *& ptr);
  bool remove(const K x, BSTNode<E, K> *& ptr);
};


template<typename E, typename K>
BSTNode<E, K> *BSTree<E, K>::search(const K x, BSTNode<E, K> *ptr) {
  if (ptr == NULL)
    return NULL;
  else if (x < ptr->data)
    return search(x, ptr->left);
  else if (x > ptr->data)
    return search(x, ptr->right);
  else return ptr;
}

template<typename E, class K>
bool BSTree<E, K>::insert(const E& e, BSTNode<E, K>*& ptr) {
  if (ptr == NULL) {
    ptr = new BSTNode<E, K>(e);
    if (ptr == NULL) {
      std::cerr << "out of space " << std::endl;
      exit(1);

    }
    return true;
  }
  else if (e < ptr->data)
    insert(e, ptr->left);
  else if (e > ptr->data)
    insert(e, ptr->right);
  else return false;
}

template<typename E, typename K>
BSTree<E, K>::BSTree(K value) {
  E x;
  root = NULL;
  refvalue = value;
  std::cin >> x;
  while (x.key != refvalue) {
    insert(x, root);
    std::cin >> x;
  }
}

template<typename E, typename K>
bool BSTree<E, K>::remove(const K x, BSTNode<E, K>*& ptr) {
  BSTNode<E, K> *temp;
  if (ptr != NULL) {
    if (x < ptr->data)
      remove(x, ptr->left);
    else if (x > ptr->data)
      remove(x, ptr->right);
    else if (ptr->left != NULL && ptr->right != NULL) {
      temp = ptr->right;
      while (temp->left != NULL)
        temp = temp->left;
      ptr->data = temp->data;
      remove(ptr->data, ptr->right);
    }
    else {
      temp = ptr;
      if (ptr->left == NULL)
        ptr = ptr->right;
      else ptr = ptr->left;
      delete temp;
      return true;
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现BinarySearchTree的delete方法的示例代码: ``` public class BinarySearchTree { private Node root; private class Node { private int key; private Node left, right; public Node(int key) { this.key = key; } } public void delete(int key) { root = delete(root, key); } private Node delete(Node x, int key) { if (x == null) return null; if (key < x.key) { x.left = delete(x.left, key); } else if (key > x.key) { x.right = delete(x.right, key); } else { if (x.left == null) return x.right; if (x.right == null) return x.left; Node t = x; x = min(t.right); x.right = deleteMin(t.right); x.left = t.left; } return x; } private Node min(Node x) { if (x.left == null) return x; return min(x.left); } private Node deleteMin(Node x) { if (x.left == null) return x.right; x.left = deleteMin(x.left); return x; } } ``` 在该实现中,delete方法首先调用delete(Node x, int key)方法,传入根节点和待删除的键。 delete(Node x, int key)方法递归遍历二叉搜索树,查找要删除的键所对应的节点。如果找到了该节点,就执行删除操作。如果节点有左右子树,就用它的右子树中的最小值节点来替代这个节点,然后删除右子树中的最小值节点。 delete(Node x, int key)方法还调用了min(Node x)和deleteMin(Node x)方法。min(Node x)方法返回以节点x为根的子树中的最小节点,deleteMin(Node x)方法删除以节点x为根的子树中的最小节点,并返回删除后的子树。 注意:以上代码仅供参考,未经完整测试,可能存在错误,请谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值