二叉搜索树(待续)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树(待续)相关的知识,希望对你有一定的参考价值。

先贴纯代码,有空再填坑

template<class K, class V>
struct BSTNode
{
 BSTNode(const K &key, const V &value)
  :_key(key)
  , _value(value)
  , _left(NULL)
  , _right(NULL)
 {}
 K _key;
 V _value;
 BSTNode<K, V> *_left;
 BSTNode<K, V> *_right;
};
template<class K, class V>
class BSTree
{
 typedef BSTNode<K, V> Node;
public:
 BSTree()
  :_root(NULL)
 {}
 ~BSTree()
 {
  _Destory(_root);
 }
 BSTree(const BSTree<K, V> &tree)
 {
  _root = _CreatHSTree(_root, tree._root);
 }
 BSTree operator=(const BSTree<K, V> &tree)
 {
  _Destory(_root);
  _root = _CreatHSTree(_root, tree._root);
  return *this;
 }
public:
 bool Insert(const K&key, const V&value)
 {
  if (_root == NULL)
  {
   _root = new Node(key, value);
   return true;
  }
  Node *parent = NULL;
  Node *cur = _root;
  while (cur)
  {
   if (cur->_key < key)
   {
    parent = cur;
    cur = cur->_right;
   }
   else if (cur->_key > key)
   {
    parent = cur;
    cur = cur->_left;
   }
   else
   {
    return false;
   }
  }
  if (key > parent->_key)
  {
   parent->_right = new Node(key, value);
  }
  else
  {
   parent->_left = new Node(key, value);
  }
  return true;
 }
 bool Insert_R(const K &key, const V &value)
 {
  return _Insert_R(_root, key, value);
 }
 Node *Find_R(const K &key)
 {
  return _Find_R(_root, key);
 }
 Node *Find(const K &key)
 {
  Node *cur = _root;
  while (cur != NULL)
  {
   if (key == cur->_key)
   {
    return cur;
   }
   else if (key < cur->_key)
   {
    cur = cur->_left;
   }
   else if (key > cur->_key)
   {
    cur = cur->_right;
   }
  }
  return NULL;
 }
 /*
 删除要考虑两种情况:
  1、叶子结点(left 和 right 均为 NULL)
  2、非叶子结点(left 和 right 有一个不是 NULL)
  3、非叶子结点(left 和 right均不是 NULL)
 */
 bool Remove(const K &key)
 {
  Node *prev = NULL;
  Node *cur = _root;
  //找到当前结点和它的父节点
  while (cur)
  {
   if (key == cur->_key)
   {
    break;
   }
   else if (key < cur->_key)
   {
    prev = cur;
    cur = cur->_left;
   }
   else if (key > cur->_key)
   {
    prev = cur;
    cur = cur->_right;
   }
  }
  //情况1(叶子结点)
  if (cur->_left == NULL && cur->_right == NULL)
  {
   if (prev != NULL)  //不是只剩一个结点的时候:
   {
    if (prev->_left == cur)
    {
     prev->_left = NULL;
    }
    else
    {
     prev->_right = NULL;
    }
   }
   delete cur;
  }
  //情况2(left 或 right 一个不是 NULL)
  else if (cur->_right == NULL)
  {
   if (prev == NULL) //处理根节点的情况
   {
    _root = cur->_left;
   }
   else
   {
    if (prev->_left == cur)
    {
     prev->_left = cur->_left;
    }
    else
    {
     prev->_right = cur->_left;
    }
    delete cur;
   }
  }
  else if (cur->_left == NULL)
  {
   if (prev == NULL) //处理根节点的情况
   {
    _root = cur->_right;
   }
   else
   {
    if (prev->_left == cur)
    {
     prev->_left = cur->_right;
    }
    else
    {
     prev->_right = cur->_right;
    }
   }
   delete cur;
  }
  //情况3(left 或 riht 都不是 NULL)
  else
  {
   Node *prev = cur;
   Node *FirstLeft = cur->_right;
   while (FirstLeft->_left)
   {
    prev = FirstLeft;
    FirstLeft = FirstLeft->_left;
   }
   Node *del = FirstLeft;
   cur->_key = del->_key;
   cur->_value = del->_value;
   if (prev->_left == FirstLeft)
   {
    prev->_left = FirstLeft->_right;
   }
   else
   {
    prev->_right = FirstLeft->_right;
   }
   delete del;
  }
  return true;
 }
 bool Remove_R(const K &key)
 {
  return _Remove_R(_root, key);
 }
 void InOrder()
 {
  InOrder_R(_root);
 }
protected:
 Node* _CreatHSTree(Node *cur, Node *_cur)
 {
  if (_cur == NULL)
  {
   return NULL;
  }
  else
  {
   cur = new Node(_cur->_key, _cur->_value);
  }
  cur->_left = _CreatHSTree(cur->_left, _cur->_left);
  cur->_right = _CreatHSTree(cur->_right, _cur->_right);
  return cur;
 }
 void _Destory(Node *root)
 {
  if (root == NULL)
  {
   return;
  }
  _Destory(root->_left);
  _Destory(root->_right);
  delete root;
 }
 bool _Remove_R(Node *&root, const K &key)
 {
  if (root == NULL)
  {
   return false;
  }
  if (root->_key > key)
  {
   return _Remove_R(root->_left, key);
  }
  else if (root->_key < key)
  {
   return _Remove_R(root->_right, key);
  }
  else  // 相等
  {
   Node *del = root;
   if (root->_left == NULL)
   {
    root = root->_right;   //这里的root是引用,
                 //可能是上一层root->_left 或 root->_right
   }
   else if (root->_right == NULL)
   {
    root = root->_left;
   }
   else
   {
    Node *FirstLeft = root->_right;
    while (FirstLeft->_left)
    {
     FirstLeft = FirstLeft->_left;
    }
    std::swap(root->_key, FirstLeft->_key);
    std::swap(root->_value, FirstLeft->_value);
    return _Remove_R(root->_right, key);
   }
   delete del;
  }
 }
 bool _Insert_R(Node *&root, const K &key, const V &value)
 {
  if (root == NULL)
  {
   root = new Node(key, value);
   return true;
  }
  else if (key < root->_key)
  {
   _Insert_R(root->_left, key, value);
  }
  else if (key > root->_key)
  {
   _Insert_R(root->_right, key, value);
  }
  return false;
 }

 Node * _Find_R(Node *root, const K &key)
 {
  if (root == NULL)
  {
   return NULL;
  }
  if (key == root->_key)
  {
   return root;
  }
  if (key < root->_key)
  {
   return _Find_R(root->_left, key);
  }
  else if (key > root->_key)
  {
   return _Find_R(root->_right, key);
  }
 }
 void InOrder_R(Node *root)
 {
  if (root == NULL)
  {
   return;
  }
  InOrder_R(root->_left);
  cout << "key: " << root->_key << ", value: " << root->_value << endl;
  InOrder_R(root->_right);
 }
protected:
 Node *_root;
};

以上是关于二叉搜索树(待续)的主要内容,如果未能解决你的问题,请参考以下文章

C++-二叉搜索树的查找&插入&删除-二叉搜索树代码实现-二叉搜索树性能分析及解决方案

代码题(10)— 二叉搜索树

代码随想录Day20-Leetcode654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

二叉搜索树(KV模型,二叉搜索树删除节点)

代码随想录算法训练营第14天|530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先

二叉树之二叉搜索树(BSTree)