深入学习理解二叉搜索树(附详细讲解与实例分析)
原博客 https://blog.csdn.net/qq_21396469/article/details/78419609
写在前面
本文主要分为三个部分。
第一部分介绍了二叉搜索树的基本性质。
第二部分全面详细地讲述了二叉搜索树的各种基本操作。包括WALK/遍历、SEARCH/查找、MINIMUM/最小关键字、MAXIMUM/最大关键字、SUCCESSOR/后继、PREDECESSOR/前驱、INSERT/插入、DELETE/删除等。主要参考《算法导论》(中文第3版)中有关二叉搜索树的相关介绍说明。
对于每一种基本操作,都至少分三个重点进行讲解。它们分别是基本操作过程及原理(包含伪代码及C++实现)、时间复杂度分析以及举例分析(配图)。力求让每位读者可以直观地理解。
第三部分则是完整的代码实现及实例分析。
本文断断续续写了几天,各部分的举例分析也十分明了,为了讲得更清楚一些,所有的配图都是自行制作的。请尊重劳动成果,供人供己查阅,如有错误之处,欢迎指正。
原创文章,转载请注明出处。http://blog.csdn.net/qq_21396469/article/details/78419609
一、二叉搜索树简介与基本性质
1、定义
二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和卫星数据(文末附注1)之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NIL的结点,而叶子结点的孩子结点指针也为NIL。
2、基本性质
根据《算法导论》(中文第3版)的相关介绍,二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:
设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key≤x.key。如果y是x右子树中的一个结点,那么y.key≥x.key。
在二叉搜索树中:
① 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值;
② 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值;
③ 任意结点的左、右子树也分别为二叉搜索树。
一棵典型的二叉搜索树如下:
二、二叉搜索树的基本操作与代码实现
1、二叉搜索树的结点
正如前面所说,每个二叉搜索树的结点,包含关键字key、左孩子指针lchild、右孩子指针rchild以及父结点指针parent。在C++实现中,我们定义一个结点类BSTNode来表示一个结点,并初始化结点的关键字等于0,左右孩子指针和父结点指针为NIL。
/* 二叉搜索树节点 */
class BSTNode
{
private:double key; // 关键字BSTNode *lchild; // 左孩子BSTNode *rchild; // 右孩子BSTNode *parent; // 父节点friend class BSTree;
public:BSTNode(double k = 0.0, BSTNode *l = NULL, BSTNode *r = NULL, BSTNode *p = NULL) :key(k), lchild(l), rchild(r), parent(p){}
};
2、二叉搜索树的基本操作
对于一棵二叉搜索树来说,它支持许多动态集合操作,包括WALK(遍历)、SEARCH(查找)、MINIMUM(最小关键字)、MAXIMUM(最大关键字)、SUCCESSOR(后继)、PREDECESSOR(前驱)、INSERT(插入)、DELETE(删除)等。下面将依次讲解这些操作的具体过程及实现。
2.1 WALK(遍历)
2.1.1 中序遍历/INORDER-TREE-WALK
二叉搜索树的性质允许我们通过一个简单的递归算法来按序输出二叉搜索树中的所有关键字,这种算法称为中序遍历(inorder tree walk)算法。对于中序遍历来说,输出的子树根的关键字位于其左子树的关键字值和右子树的关键字值之间。其伪代码如下:
根据上述伪代码,我们可以很容易地写出中序遍历二叉搜索树的实现。
// 中序遍历void inOrder_Tree_Walk(BSTNode *x){if (x != NULL){inOrder_Tree_Walk(x->lchild);cout << x->key << " ";inOrder_Tree_Walk(x->rchild);}}
得益于二叉搜索树的性质,当使用中序遍历来访问一棵二叉搜索树上的所有结点时,最后得到的访问序列恰好是所有结点关键字的升序序列。
2.1.2 先序遍历/PREORDER-TREE-WALK
跟中序遍历类似,先序遍历(preorder tree walk)算法也是通过递归来实现的。区别在于先序遍历输出的子树根的关键字在其左右子树的关键字值之前。我们同样可以写出先序遍历的伪代码:
同样,根据上述伪代码,我们可以很容易地写出先序遍历二叉搜索树的实现。
深入学习理解二叉搜索树(附详细讲解与实例分析)相关推荐
- C语言判断二叉树是否为二叉搜索树(附完整源码)
C语言判断二叉树是否为二叉搜索树 C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) C语言判断二叉树是否为二叉搜索树完整源码(定义,实现,main函数测试) #include ...
- [学习][数据结构]二叉搜索树
定义 一棵二叉搜索树是以一棵二叉树来组织的,如下图.这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象.除了key和卫星数据之外,每个节点还包含属性left.right和p,他们分别指 ...
- 深入理解二叉搜索树(BST)
一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性.如果某个孩子结点不存在,其指针属 ...
- leetcode 235. 二叉搜索树的最近公共祖先 思考分析
目录 题目 思考 迭代法 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 ...
- LeetCode 530. 二叉搜索树的最小绝对差 思考分析
目录 题目 思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值 思路2:不用数组,进行优化 思路3.回顾迭代法求解 题目 给你一棵所有节点为非负值的二叉搜索树,请你计算 ...
- python中.find函数的使用方法及实例_FIND函数的详细讲解及实例分析
在写LOOKUP的时候就想写一下FIND函数,此函数是我经常用到的函数,无论是在EXCEL中还是在VBA中,此函数的利用价值极高,很值得推荐,此函数应用简单,易学易用.我在以前的VBA文章中非常详细地 ...
- python好用的模块和包_Python模块和包详细讲解与实例分析
一丶模块 我们经常说模块模块的,究竟什么是模块呢? 一个模块就是包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀 但其实import加载的模块分为四个通用类别: 1.使用Pyth ...
- 二叉搜索树简介和部分题目
引言 二叉搜索树是一个有序树,遵循以下规则: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉 ...
- java 双向链表_Day26:二叉搜索树与双向链表
剑指Offer_编程题--二叉搜索树与双向链表 题目描述: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点.只能调整树中节点指针的指向. 具体要求: 时间限制: ...
最新文章
- 怎么将对象里面部分的属性放到一个空的对象里面去
- 麦肯锡报告:传统车企正面临出行的数字化颠覆
- POJ 2987 Firing(最大权闭合图)
- Maven添加Oracle的依赖及驱动
- matlab内置函数fitgeotrans与transformPointsForward解析
- JS -------------------设置弹出框位置屏幕的中间
- 孩子哭的时候大人应该怎么办?
- POJ 3581:Sequence(后缀数组)
- 小程序-涂鸦画笔(案例-集福)
- 宇宙质量估算为10^53KG
- Python学习---Python数据类型1206
- Nodejs写的搬家工具知识分享
- 数据库导出Excel乱码 解决
- NCIE(国家网络工程师认证)
- idea 配置maven插件
- 分区助手扩大c盘后自动修复_如何扩大c盘空间? 不用重装系统,分区助手轻松搞定...
- 全球半导体今年出货有望创新高,蓝牙芯片需求强劲
- MATLAB求分数阶微分的数值解,G-L定义,R-L定义,Caputo定义
- 排查内存orJVM内存飙高
- Linux学习-redis主从架构