Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260352
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-04-15 18:15:03

二叉查找树是每一个几点都满足左孩子小于根,右孩子大于根的数。为查找而生。
1.创建

  1. bool Insert(BSTNode<K,V>*& root,const K& key,const V& v)
  2.     {
  3.         if(root == NULL)
  4.         {
  5.             root = new Node(key,v);
  6.             return true;
  7.         }
  8.         else
  9.         {
  10.             if(key < root->_key)
  11.             {
  12.                 Insert(root->_left,key,v);
  13.             }
  14.             if(key > root->_key)
  15.             {
  16.                 Insert(root->_right,key,v);
  17.             }
  18.             else
  19.             {
  20.                 return false;
  21.             }
  22.         }
  23.     }
2.查找(递归、非递归)

  1. bool Find_R(BSTNode<K,V>*& root,const K& key)//递归实现
  2.     {
  3.         if(root == NULL)
  4.         {
  5.             return false;
  6.         }
  7.         else
  8.         {
  9.             if(key == root->_key)
  10.             {
  11.                 return true;
  12.             }
  13.             else if(key > root->_key)
  14.             {
  15.                 Find_R(root->_right,key);
  16.             }
  17.             else
  18.             {
  19.                 Find_R(root->_left,key);
  20.             }
  21.         }
  22.     }
  23.     bool Find(BSTNode<K,V>*& root,const K& key)//非递归实现
  24.     {
  25.         if(root == NULL)
  26.         {
  27.             return false;
  28.         }
  29.         Node *cur = root;
  30.         while(cur)
  31.         {
  32.             if(key == cur->_key)
  33.             {
  34.                 return true;
  35.             }
  36.             if(key < cur->_key)
  37.             {
  38.                 cur = cur->_left;
  39.             }
  40.             else
  41.             {
  42.                 cur = cur->_right;
  43.             }
  44.         }
  45.         return false;
  46.     }

3.删除(递归、非递归)

  1. bool Remove(const K& key)
  2.     {
  3.         if (_root == NULL)
  4.         {
  5.             return false;
  6.         }
  7.         if (_root->_left == NULL && _root->_right == NULL && _root->_key == key)
  8.         {
  9.             delete _root;
  10.             _root = NULL;
  11.             return true;
  12.         }
  13.         Node *del = _root;
  14.         Node *parent = del;
  15.         while (del && del->_key != key)
  16.         {
  17.             parent = del;
  18.             if (del->_key > key)
  19.             {
  20.                 del = del->_left;
  21.             }
  22.             else if (del->_key < key)
  23.             {
  24.                 del = del->_right;
  25.             }
  26.         }
  27.         if (del)
  28.         {
  29.             if (del->_left == NULL)
  30.             {
  31.                 if (parent->_left == del)
  32.                 {
  33.                     parent->_left = del->_right;
  34.                 }
  35.                 else
  36.                 {
  37.                     parent->_right = del->_right;
  38.                 }
  39.                 delete del;
  40.                 return true;
  41.             }
  42.             else if(del->_right == NULL)
  43.             {

  44.                 if (parent->_left == del)
  45.                 {
  46.                     parent->_left = del->_left;
  47.                 }
  48.                 else
  49.                 {
  50.                     parent->_right = del->_left;
  51.                 }
  52.                 delete del;
  53.                 return true;
  54.             }
  55.             else
  56.             {
  57.                 Node *InOrderfirst = del->_right;
  58.                 Node *parent = del;
  59.                 while (InOrderfirst->_left)
  60.                 {
  61.                     parent = InOrderfirst;
  62.                     InOrderfirst = InOrderfirst->_left;
  63.                 }
  64.                 swap(del->_key, InOrderfirst->_key);
  65.                 swap(del->_value, InOrderfirst->_value);
  66.                 if(InOrderfirst->_right != NULL)
  67.                 {
  68.                     parent->_left = InOrderfirst->_left;
  69.                 }
  70.                 delete InOrderfirst;
  71.                 return true;
  72.             }
  73.         }
  74.         return false;
  75.     }
  76.     bool Remove_R(Node*& root, const K& key)
  77.     {
  78.         if (root == NULL)
  79.         {
  80.             return false;
  81.         }
  82.         if (key < root->_key)
  83.         {
  84.             return Remove_R(root->_left, key);
  85.         }
  86.         else if (key > root->_key)
  87.         {
  88.             return Remove_R(root->_right, key);
  89.         }
  90.         else
  91.         {
  92.             Node* del = root;
  93.             if (root->_left == NULL)
  94.             {
  95.                 root = del ->_right;
  96.             }
  97.             else if (root->_right == NULL)
  98.             {
  99.                 root = del->_left;
  100.             }
  101.             else
  102.             {
  103.                 Node* First = root->_right;
  104.                 while (First->_left)
  105.                 {
  106.                     First = First->_left;
  107.                 }
  108.                 swap(del->_key, First->_key);
  109.                 swap(del->_value, First->_value);
  110.                 return Remove_R(root->_right, key);
  111.             }
  112.             delete del;
  113.             del = NULL;
  114.             return true;
  115.         }
  116.     }


4.摧毁

  1. void Destroy(BSTNode<K,V>* root)
  2.         {
  3.             if(root == NULL)
  4.             {
  5.                 return;
  6.             }
  7.             Destroy(root->_left);
  8.             Destroy(root->_right);
  9.             if(root->_left == NULL&&root->_right == NULL)
  10.             {
  11.                 delete root;
  12.             }
  13.         }




阅读(1371) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

enenshiwo2016-04-15 20:01:43

狼行China:文明上网,理性发言...

........我这么理性

回复 | 举报

狼行China2016-04-15 19:25:47

文明上网,理性发言...