二叉排序树详解及实现
二叉排序树详解及实现
- 1.什么是二叉排序树
- 2.二叉排序树的数据结构
- 2.1二叉排序树的节点类型
- 2.2二叉排序树中插入某个元素
- 2.3 二叉排序树中按值查找元素
- 2.4 找排序二叉树中的最小值
- 2.5返回排序二叉树中ptr中序遍历的后续节点
- 2.6 寻找排序二叉树中的最大值
- 2.7 寻找二叉树中中序遍历ptr节点的前驱
- 2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)
- 2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)
- 2.10删除排序二叉树的结点元素为value的结点
- 3.具体程序及运行结果
1.什么是二叉排序树
二叉排序树(Binary Sorting Tree)又称二叉搜索树(Binary Search Tree),是一种特殊结构的二叉数,作为一种排序和查找的手段,对应有序表的对半查找,通常亦被称为数表。其定义也是递归的。
二叉排序树的定义:
每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同;
二叉排序树或者是空树或者是具有下述性质的二叉数,①其左子树上所有结点的数据值均小于根结点的数据值;②右子树上所有结点的数据值均大于根结点的数据值;③左子树和右子树又各是一棵二叉排序树。
二叉排序树用中序遍历就可以得到由小到大的有序序列
2.二叉排序树的数据结构
2.1二叉排序树的节点类型
typedef struct BstNode//二叉树的节点类型
{KeyType key; BstNode* parent;//父节点BstNode* leftchild;//左孩子BstNode* rightchild;//右孩子
}BstNode;
2.2二叉排序树中插入某个元素
bool Binary_Sort_Tree::Insert_Value(KeyType value)
{//如果是一棵空树if (root ==nullptr){root = MakeNode(value);//建立一个根节点return true;}//如果不是一棵空树 BstNode* ptr = root;BstNode* parent = NULL;//记录ptr的父节点while (ptr != NULL && ptr->key != value){parent = ptr;ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;}
//case1:插入相同元素if (ptr != NULL && ptr->key == value) return false;//不能插入相同元素
//case2:空位置ptr = MakeNode(value);ptr->parent = parent;if (ptr->key > parent->key) { parent->rightchild = ptr; }else { parent->leftchild = ptr; }cursize++;return true;
}
2.3 二叉排序树中按值查找元素
如果要查找的元素值>根节点值,就在根节点右边查找,否则在根节点左边查找。
BstNode* Binary_Sort_Tree::FindValue(KeyType value)
{BstNode* ptr = root;while (ptr != nullptr && ptr->key != value){ptr = value > ptr->key ? ptr->rightchild : ptr->leftchild;}return ptr;
}
2.4 找排序二叉树中的最小值
根据排序二叉树的性质,可以很轻松的得到最小值即为最左边节点的值。
BstNode* Binary_Sort_Tree::FirstNodeByMiddleOrder()
{BstNode* ptr = root;while (ptr && ptr->leftchild){ptr = ptr->leftchild;}return ptr;
}
2.5返回排序二叉树中ptr中序遍历的后续节点
节点ptr的后续节点为排序二叉树中第一个比ptr->key大的元素,即可以分为如下两种情况:
①如果ptr存在右子树,则ptr的后续节点为ptr右子树的最左端的节点。
②如果ptr不存在右子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::NextNodeByMiddleOrder(BstNode* ptr)
{ if (ptr == NULL) return ptr;if (ptr->rightchild != NULL){return FirstNodeByMiddleOrder(ptr->rightchild);//右子树的最左端}else{BstNode* parent = ptr->parent;while (parent != NULL && parent->leftchild != ptr)//pa->rightleft == ptr;{ptr = parent;parent = ptr->parent;}return parent;}
}
2.6 寻找排序二叉树中的最大值
根据排序二叉树的性质,可以很轻松的得到最小值即为最右边节点的值。
BstNode* Binary_Sort_Tree::LastNodeByMiddleOrder()
{BstNode* ptr = root;while (ptr && ptr->rightchild){ptr = ptr->rightchild;}return ptr;
}
2.7 寻找二叉树中中序遍历ptr节点的前驱
节点ptr的前驱为排序二叉树中第一个比ptr->key小的元素,即可以分为如下两种情况:
①如果ptr存在左子树,则ptr的后续节点为ptr左子树。
②如果ptr不存在左子树,则ptr的后续节点可以回溯到根节点
具体如下:
BstNode* Binary_Sort_Tree::PrecursorofPtr(BstNode* ptr)
{if (ptr == NULL) return ptr;if (ptr->leftchild != NULL){return LastNodeByMiddleOrder(ptr->leftchild);//左子树的最右端}else{BstNode* parent = ptr->parent;while (parent != NULL && parent->rightchild != ptr)//pa->rightleft == ptr;{ptr = parent;parent = ptr->parent;}return parent;}
}
2.8中序遍历排序二叉树(从小到大打印排序二叉树所有元素)
void Binary_Sort_Tree::MiddleOrder()
{cout << "排序二叉树的非递归中序遍历:" << endl;BstNode* ptr = FirstNodeByMiddleOrder();for (; ptr != nullptr; ptr = NextNodeByMiddleOrder(ptr)){cout << ptr->key << " ";}cout << endl;
}
2.9 逆向打印排序二叉树(从大到小打印排序二叉树所有元素)
void Binary_Sort_Tree::ReverseInorder()
{BstNode* ptr = root;cout << "二叉排序树的逆向打印:" << endl;for (BstNode* p = LastNodeByMiddleOrder(ptr); p != NULL; p = PrecursorofPtr(p)){cout << p->key << " ";}cout << endl;
}
2.10删除排序二叉树的结点元素为value的结点
删除某个元素可分为以下三种情况:
①如果是叶子节点直接删除即可。
②如果不是叶子节点具体讨论如下:
bool Binary_Sort_Tree::RemoveNode(KeyType value)
{BstNode* ptr = root;//空树的删除if (ptr == NULL) return false;BstNode* pa = NULL;BstNode* p = ptr;while (p && p->key != value){//pa = p;p = value < p->key ? p->leftchild : p->rightchild;}//没有找到这个结点if (p == NULL) return false;//双分支if (p->leftchild && p->rightchild){BstNode* q = FirstNodeByMiddleOrder(p->rightchild);p->key = q->key;p = q;}//单分支pa = p->parent;BstNode* child = p->leftchild != NULL ? p->leftchild : p->rightchild;if (child){child->parent = pa;}if (pa == NULL){ptr = child;}else{if (pa->leftchild == p){pa->leftchild = child;}else{pa->rightchild = child;}}cursize--;//直接是叶子delete p;return true;
}
3.具体程序及运行结果
程序如下:
二叉排序树的代码下载
二叉排序树详解及实现相关推荐
- 数据结构与算法——二叉排序树详解以及代码实现
二叉排序树介绍 我们知道二叉树,每个结点最多有2棵子树,被称为左子树 和 右子树. 二叉排序树,显然也是一颗二叉树,它有更突出的特性在数据域上呈现排序的特性. 在二叉排序树中,每个树的左子树的数据域均 ...
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...
- 详解二叉排序树及其基本操作
详解二叉排序树及其基本操作 二叉排序树又称二叉查找树,它是一种对排序和查找都很有用的特殊二叉树. 1. 二叉排序树的定义 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: (1) 若它的左子树不 ...
- Java 集合类详解
0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ...
- 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解
目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...
- 剑指offer(1-10题)详解
文章目录 01二维数组的查找 02替换空格 03从尾到头打印链表 04重建二叉树★ 05 用两个栈实现队列 06旋转数组的最小数字 07 斐波那契数列 08 跳台阶 09 变态跳台阶★ 10 矩阵覆盖 ...
- AVL树平衡旋转详解
AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...
- [学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]
文章目录 引入概念 全套模板 变量声明 update ==rotate旋转== splay操作 insert插入 delete删除 查找x的位置 查找第k大 前驱/后继 极小值-inf和极大值inf的 ...
- 红黑树操作详解——很形象的过程
红黑树是一种很好的自平衡二叉排序树,在此,给出一个网友给出的红黑树操作详解: https://segmentfault.com/a/1190000012728513 里面给出了红黑树的详细操作,过程很 ...
最新文章
- python 二维 排序
- 外观模式(Facade) - 为系统分层次
- Python cv2 摄像头
- (1)kendo UI使用基础介绍与问题整理——简单说明
- angular directive自定义指令
- cent os重置mysql,linux mysql 能登陆不能修改用户(cent os 6.2)解决思路
- python调用matlab环境配置、非常详细!!!_[python][matlab]使用python调用matlab程序
- 一个牛逼的coder是这样诞生的。
- “遗留代码是传奇!”
- HSImageSidebarView
- Hyperledger fabric v2.3 交易流程 翻译
- Dev ChartControl
- 汉王考勤管理系统使用教程
- Windows11企业版22000.1精简版(附下载链接)
- 深海迷航坐标传送代码_深海迷航 代码整合
- Android实现多国语言适配:app名称随系统的语言而更换
- 【jzoj1592】【二分】【GDKOI训练】音乐节拍
- 腾达路由器怎么设置网站服务服务器,腾达(Tenda)-无线路由器如何设置上网?
- (简单)华为P20 EML-AL00的USB调试模式在哪里打开的步骤
- Overload(重载)