一、搜索二叉树

1、定义:它是一棵排序二叉树,可为空树。

2、性质:

  • 每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同;

  • 左子树上所有节点的关键码(key)都小于根节点的关键码(key);

  • 右子树上所有节点的关键码(key)都大于根节点的关键码(key);

  • 左、右子树都是二叉搜索树。

二、源代码

1、定义节点

template<class K,class V>
struct BSTreeNode
{BSTreeNode<K,V> *_left;//左节点BSTreeNode<K,V> *_right;//右节点K _key;//节点权值V _value;BSTreeNode(const K& key,const V& value):_key(key),_value(value),_left(NULL),_right(NULL){}
};

2、搜索二叉树及其相关实现

template<class K,class V>
class BSTree
{typedef BSTreeNode<K,V> Node;
public:BSTree():_root(NULL){}//非递归Node* Find(const K& key){return _Find(_root,key);}bool Insert(const K& key,const V& value){return _Insert(_root,key,value);}bool Remove(const K& key){return _Remove(_root,key);}//递归bool InOrder() //中序遍历 --> 有序序列{return _InOrder(_root);cout<<endl;}Node* FindR(const K& key){return _FindR(_root,key);}bool InsertR(const K& key,const V& value){return _InsertR(_root,key,value);}bool RemoveR(const K& key){return _RemoveR(_root,key);}
protected://非递归Node* _Find(Node *root,const K& key){if(root == NULL) return NULL;Node *cur=root;if(cur->_key > key){cur=cur->_right;}else if(cur->_key < key){cur=cur->_left;}else {return cur;}return NULL;}    bool _Insert(Node *&root,const K& key,const V& value){if(root == NULL){root=new Node(key,value);return true;}Node *cur=root;Node *parent=NULL;while(cur){if(cur->_key < key){parent=cur;cur=cur->_right;}else if(cur->_key > key){parent=cur;cur=cur->_left;}elsereturn false;}if(parent->_key < key){parent->_right=new Node(key,value);parent->_right=parent;}else{parent->_left=new Node(key,value);parent->_left=parent;}return true;}bool _Remove(Node*& root,const K& key ){if(root == NULL) return false;Node *cur=root;Node *parent=NULL;while(cur) //找节点{if(cur->_key > key){parent=cur;cur=cur->_left;}else if(cur->_key < key){parent=cur;cur=cur->_right;}else //找到节点{if(cur->_left == NULL)//左为空{if(parent == NULL)root=cur->_right;else if(parent->_left == cur)parent->_left=cur->_right;elseparent->_right=cur->_right;}else if(cur->_right == NULL)//右为空{if(parent == NULL)root=cur->_left;else if(parent->_left == cur)parent->_left=cur->_left;elseparent->_right=cur->_left;}else //左右都不为空{Node *parent=cur;Node *left=cur->_right;//右子树的最左节点while(left->_left){left=left->_left;}cur->_key=left->_key;//替换结点cur->_value=left->_value;if(parent->_left == left)parent->_left=left->_left;elseparent->_right=left->_right;delete left;}}return true;}return false;}//递归bool _InOrder(Node *root){if(root == NULL) return false;_InOrder(root->_left);cout<<root->_left<<" ";_InOrder(root->_right);return true;}Node* _FindR(Node *root,const K& key){if(root == NULL) return NULL;if(root->_key == key)return root;else if(root->_key > key)return _FindR(root->_left,key);elsereturn _FindR(root->_right,key);}bool _InsertR(Node *root,const K& key,const V& value){if(root == NULL) {root=new Node(key,value);return true;}if(root->_key > key)return _InsertR(root->_left,key,value);else if(root->_key < key)return _InsertR(root->_right,key,value);elsereturn false;}bool _RemoveR(Node *root,const K& key){if(root == NULL) return false;if(root->_key > key)return _RemoveR(root->_left,key); else if(root->_key < key)return _RemoveR(root->_right,key);else  //找到节点{Node *del=NULL;if(root->_left == NULL) root=root->_right;else if(root->_right == NULL)root=root->_left;else {Node *parent=NULL;Node *left=root;while(left->_left){parent=left;left=left->_left;}root->_key=left->_key;root->_value=left->_value;del=left;if(parent->_left == left)parent->_left=left->_left;elseparent->_right=left->_right;delete del;return true;}}return false;}
protected:Node *_root;
};

3、总结:

搜索二叉树是一棵排序二叉树,可为空树。它的每一个节点都遵从搜索二叉树的性质。

搜索二叉树的中序遍历后为升序序列;其查找根据key值以及性质进行;其插入需先根据其key值找到插入的节点,随后添加节点,另外其key值唯一;

其删除节点时,需分3种情况:

(1)仅左为空;

(2)仅右为空;

(3)该节点左右皆不为空。

删除该节点,即需 找到 右子树的最左节点 或 左子树的最右节点,作为替换结点。

转载于:https://blog.51cto.com/zxtong/1829779

数据结构 -- 搜索二叉树相关推荐

  1. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树

    数据结构与算法之判断一棵树是否为搜索二叉树.判断一棵树是否是完全二叉树 目录 判断一棵树是否为搜索二叉树 判断一棵树是否是完全二叉树 1. 判断一棵树是否为搜索二叉树 概念:搜索树就是中序遍历的结果是 ...

  2. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

  3. 数据结构:二叉树(BinaryTree)原理及其java实现

    1.如何定义一个二叉树 通过递归的方式定义二叉树:不能直接定义二叉树,只能定义二叉树结点.节点类的属性包括当前节点的值.左子节点.右子节点(子节点的类型也是二叉树结点类).构造函数,代码如下: pub ...

  4. python处理mysql数据结构_python环境下使用mysql数据及数据结构和二叉树算法(图)...

    python环境下使用mysql数据及数据结构和二叉树算法(图): 1 python环境下使用mysql 2使用的是 pymysql库 3 开始-->创建connection-->获取cu ...

  5. python实现mysql二叉树_python环境下使用mysql数据及数据结构和二叉树算法(图)...

    python环境下使用mysql数据及数据结构和二叉树算法(图): 1 python环境下使用mysql 2使用的是 pymysql库 3 开始-->创建connection-->获取cu ...

  6. 【C++】搜索二叉树

    目录 1.搜索二叉树概念 1.1搜索二叉树认知 1.2搜索二叉树结构 1.3中序遍历 2.查找 2.1非递归实现: 2.2递归实现 3.插入实现(insert) 3.1非递归实现 3.2递归实现 4删 ...

  7. C++13:搜索二叉树

    目录 搜索二叉树概念 模拟实现搜索二叉树 插入函数实现 插入函数实现(递归) 查找函数实现 删除函数实现 删除函数实现(递归) 中序遍历实现 拷贝构造函数实现 析构函数实现 赋值重载 我们在最开始学习 ...

  8. 数据结构之二叉树基本介绍

    数据结构之二叉树基本介绍 说明:总是会忘记二叉树的相关概念在这里记录一下 二叉树:每个节点最多有两个子树的树结构. 根节点:一棵树最上面的节点称为根节点. 父节点.子节点:如果一个节点下面连接多个节点 ...

  9. Java实现BST:搜索二叉树

    文章目录 数据结构的定义 非递归增加节点 递归增加节点 非递归删除节点 递归删除节点 非递归搜索 递归搜索 先序遍历-递归 中序遍历-递归 后序遍历-递归 先序遍历-非递归 中序遍历-非递归 后序遍历 ...

最新文章

  1. 【翻译】将Ext JS Grid转换为Excel表格
  2. 都在抢论文第一作者,怎么解决?
  3. 45本互联网圣经级别书籍!包邮送到家!一书在手,天下我有!
  4. Linux如何找到所有elf文件,linux – ELF文件中的导入表在哪里?
  5. Django的路由分发与名称空间
  6. Visual C++设计UDP协议通讯示例
  7. windows 建立wifi热点
  8. .NET基础示例系列之十五:操作Excel
  9. java ee 设计模式解析与应用_Java EE 设计模式解析与应用_IT教程网
  10. Eclipse使用教程(入门级)
  11. 为啥Hibernate的HQL查询要使用别名呢?
  12. secureCRT快捷粘贴操作
  13. python正则抓取身份证号码,验证18位身份证号码是否正确
  14. 不适合学习编程的人是你吗?
  15. 启动docker时映射到宿主机时出现 /usr/bin/docker-current: Error response from daemon: driver failed……的解决方案
  16. 【游戏建模】将Ciri转为守望先锋的角色
  17. linux xmanager使用教程,Xmanager企业版中各软件功能简介
  18. 利用光猫IPTV通道实现双拨上网成功
  19. 《深入浅出RxJS》读书笔记
  20. java后端上传文件校验文件后缀

热门文章

  1. 用户管理系统_【20201204】做个用户管理系统(18)——注册功能的实现(三)...
  2. turtle python tkinter_【案例】 什么?idle 中竟然有内置 turtle 样例?(paint)
  3. java线性表合并_单链表的合并(Java实现)
  4. 计算机无法用u盘重装系统,没有u盘电脑开不了机重装系统的方法步骤详细教程 - 系统家园...
  5. 我的世界php开服环境_PHP初学者如何搭建环境,并在本地服务器(or云端服务器)运行自己的第一个PHP样例...
  6. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc
  7. python进程多任务
  8. 区块链中的数学 - EdDSA签名机制
  9. 使用PowerDesigner做数据库设计(一)
  10. linux硬件抽象层框图,理解和使用Linux的硬件抽象层HAL.docx