二叉搜索树的增加 查找 删除
来源:互联网 发布:知乎 郭德纲 编辑:程序博客网 时间:2024/05/16 18:00
概念:
二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树
1.若它的左子树不为空,则它的左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则它的右子树上所有节点的值都大于根节点的值
3.它的左右字数也都为二叉搜索树
操作:
搜索:
若根结点不为空:
如果根节点的key==查找的key 返回true
如果节点的key>查找的key 在左子树中找
如果节点的key<查找的key 在右子树中找
否则 返回false
插入:如果根节点为空,直接插入,如果根节点不为空,先检测新插入节点是否在树中存在,如果存在返回false,如果不存在,找到合适的位置插入
删除:
首先查找元素是否在二叉搜索树中,如果不存在,则返回;
否则要删除的结点可能分下面四种 情况:
1、要删除的结点无孩子结点;
2、要删除的结点只有左孩子结点;
3、要删除的结点只有右孩子结点;
4、要删除的结点有左、右孩子结点;
对于上述情况,相应的删除方法如下:
a、直接删除该结点
b、删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点;
c、删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点;
d、在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到 被删除节点中,在来处理该结点的删除问题
#pragma once#include<iostream>using namespace std;template<class k,class v>struct BSTreeNode{BSTreeNode<k,v>* _left;BSTreeNode<k,v>* _right;k _key;v _value;BSTreeNode<k,v>(const k&key ,const v&value):_left(NULL),_right(NULL),_key(key), _value(value){}};template <class k,class v>class BSTree{typedef BSTreeNode<k,v> Node;public:BSTree():_root(NULL){}bool Insert(const k& key,const v&value){//1.没有节点 直接插入到第一个if (_root == NULL){_root = new Node(key,value);return true;}//2.如果有节点,找到合适的位置插入Node *parent = NULL;Node *cur = _root;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key<key){parent = cur;cur = cur->_right;}elsereturn false;}if (parent->_key>key){parent->_left = new Node(key,value);}else{parent->_right = new Node(key,value);}return true;}bool InsertR(const k& key, const v& value)//用递归实现{return _InsertR(_root, key, value);}Node* Find(const k& key){if (_root == NULL){return NULL;}Node *cur = _root;while (cur){if (cur->_key > key){cur = cur->_left;}else if (cur->_key<key){cur = cur->_right;}else{return cur;}}return NULL;}bool Remove(const k& key){if (_root == NULL){return false;}//找到要删除的节点Node *parent = NULL;Node*del = _root;while (del){if (del->_key > key){parent = del;del = del->_left;}else if (del->_key < key){parent = del;del = del->_right;}else{break;}}if (del){ if (del->_left == NULL) //要删除节点左节点为空{if (del == _root)_root = del->_right; else if (del == parent->_left) parent->_left = del->_right;else parent->_right = del->_right;}else if (del->_right == NULL)//要删除节点的右节点为空{if (del == _root)_root = del->_left;else if (del == parent->_left)parent->_left = del->_left;elseparent->_right = del->_left;}else//要删除节点的左右节点都不为空{Node* cur = del->_right; parent = del; while (cur->_left) { parent = cur; cur = cur->_left; } swap(_root->_key,cur->_key); swap(_root->_value, cur->_value); if (cur == parent->_left) parent->_left = cur->_right; else parent->_right = cur->_right; del = cur;}delete del;del = NULL;return true;}return false;}bool RemoveR(const k&key)//用递归实现{return _RemoveR(_root, key);}void InOderNonR(){_InOderNoR(_root);cout << endl;}protected:bool _Insert(Node *& _root,const k & key, const v &value){if (_root == NULL){_root = new Node(key, value);return true;}if (_root->_key > key)_Insert(_root->_left, key, value);else if (_root->_key < key)_Insert(_root->_left, key, value);elsereturn false;}bool _RemoveR(Node *&_root, const k&key){if (_root == NULL){return false;}if (_root->_key > key){_RemoveR(_root->_left, key);}else if (_root->_key < key){_RemoveR(_root->_right, key);}else{Node* del = _root;if (_root->_left == NULL){_root = _root->_right;}else if (_root->_right == NULL){_root = _root->_left;}else{Node*cur = _root->_right;Node*parent = _root;while (cur->_left){parent = cur;cur = cur->_left;}swap(_root->_key, cur->_key);swap(_root->_value, cur->_value);if (parent->left == cur){parent->_left = cur->_right;}elseparent->_right = cur->_right;del = cur;}delete del;del = NULL;}return true;}void _InOderNoR(Node *_root){if (_root == NULL){return;}_InOderNoR(_root->_left);cout << _root->_key << "_"<<_root->_value<<" ";_InOderNoR(_root->_right);}private:Node* _root;};
- 二叉搜索树的增加 查找 删除
- 二叉搜索树的查找、插入、删除
- 二叉搜索树的插入,查找,删除
- 二叉搜索树的创建 查找 删除
- 二叉搜索树(二叉排序树,二叉查找树,二叉检索树)的查找,插入,删除
- 二叉搜索树的建立, 查找, 删除操作...
- 二叉搜索树的创建 && 查找 & 插入 & 删除
- 二叉搜索树的插入,删除,查找操作
- 二叉搜索树的查找、插入、删除操作
- 二叉搜索(排序)树的 查找、插入、删除
- 二叉搜索树(BST)的创建、插入、查找和删除
- 二叉搜索树的定义、查找、插入和删除
- 二叉搜索树的查找、添加和删除操作
- 二叉搜索树的构建,遍历,查找,删除
- 【数据结构】二叉搜索树的删除,插入,查找
- 二叉搜索树的查找与删除4.12
- 二叉搜索树的查找与删除一些基本操作
- 二叉搜索树的插入、查找、删除等操作
- openCV学习之accumulateWeighted方法
- POJ 2387 Til the Cows Come Home (Spfa) .
- 漫步线性代数三——高斯消元法
- MySQL分区表
- linux环境下创建数据库
- 二叉搜索树的增加 查找 删除
- 一个简单的HTTP暴力破解、撞库攻击脚本
- ScrollView和ListView等组件滑动事件冲突解决方法
- UIScrollView高级用法:delaysContentTouches与canCencelContentTouches属性
- JS透明度变化动画
- ThreadPoolExecutor使用介绍
- Mysql语法基本操作
- linux常见命令
- 自定义控件——自定义控件属性(attr.xml,TypedArray)