二叉查找树

树内容理解之红黑树

梦想的初衷 提交于 2019-11-29 20:49:45
明白红黑树前需要理解的前提概念:   二叉查找树(BST)     1.左子树上所有节点的值均<=他的根节点的值     2.右子树上所有节点的值均>=他的根节点的值     3.左右子树也一定分别为二叉查找树 二叉查找树利用和二分查找相同的概念来进行数据的便捷查找:(二分查找见排序算法解释) 如果根节点足够大,二叉查找树“左腿”会很长。如下图: 此时为了平衡左腿节点,(最长路径不超过最短路径的两倍)引入平衡的二叉查找树=> 红黑树 : 红黑树满足:(在满足树自身是一个二叉查找树BST的前提下)   1.节点是红色或者黑色。   2.根节点是黑色。   3.每个叶子的节点都是黑色的空节点。   4.每个红色节点的两个子节点都是黑色的。   5.从任意节点到其每个叶子的所有路径都包含相同的黑色节点。 来源: https://www.cnblogs.com/saber123/p/11531581.html

红黑树存在的合理性

我只是一个虾纸丫 提交于 2019-11-29 18:18:43
写在前面   主要描述为什么有了二叉查找树/平衡树还需要红黑树 1、二叉查找树的缺点   二叉查找树,相信大家都接触过,二叉查找树的特点就是左子树的节点值比父亲节点小,而右子树的节点值比父亲节点大,如图   基于二叉查找树的这种特点,我们在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉查找树,正常的情况下,查找的时间复杂度为 O(logn)。   之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如    这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条链表,这样的二叉查找树的查找时间复杂度顿时变成了 O(n),可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树。 2、平衡二叉树   平衡二叉树就是为了解决二叉查找树退化成一颗链表而诞生了,平衡树具有如下特点   1、具有二叉查找树的全部特性。   2、每个节点的左子树和右子树的高度差至多等于1。   例如:图一就是一颗平衡树了,而图二则不是(节点右边标的是这个节点的高度)   对于图二,因为节点9的左孩子高度为2,而右孩子高度为0。他们之间的差值超过1了。   平衡树基于这种特点就可以保证不会出现大量节点偏向于一边的情况了。关于平衡树如何构建、插入、删除、左旋、右旋等操作这里不在说明,具体可以看我之前写的一篇文章:

二叉查找树的第 K 个结点

隐身守侯 提交于 2019-11-29 16:45:33
private TreeNode ret; private int cnt = 0; public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret; } private void inOrder(TreeNode root, int k) { if (root == null || cnt >= k) return; inOrder(root.left, k); cnt++; if (cnt == k) ret = root; inOrder(root.right, k); } 思路:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。 // 所以,按照中序遍历顺序找到第k个结点就是结果。 来源: https://my.oschina.net/u/3973793/blog/3106188

红黑树(自平衡的二叉查找树)

放肆的年华 提交于 2019-11-29 04:54:48
30张图带你彻底理解红黑树 红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理? 红黑树定义和性质 红黑树是一种 含有红黑结点并能自平衡的二叉查找树 。它必须满足下面性质: 性质1:每个节点要么是黑色,要么是红色。 性质2: 根节点 是 黑色 。 性质3:每个 叶子节点 (NIL)是 黑色 。 性质4:每个 红色结点的两个子结点 一定都是 黑色 。 性质5: 任意一结点到每个叶子结点 的路径都 包含数量相同的黑结点 。 性质5.1:如果 一个结点存在黑子结点 ,那么 该结点肯定有两个子结点 (在Java中, 叶子结点 是 为null 的结点。) 图1就是一颗简单的红黑树。其中Nil为叶子结点,并且它是黑色的。(值得提醒注意的是,在Java中,叶子结点是为null的结点。) 红黑树并 不是 一个 完美平衡(左右子树高度相差为0)二叉查找树 ,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的 黑结点的层数是相等的 ,也即 任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点 (性质5)。所以我们叫红黑树这种平衡为 黑色完美平衡 。 我们把 正在处理(遍历)的结点 叫做 当前结点 ,如图2中的D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。 红黑树自平衡 红黑树能自平衡,它靠的是什么?三种操作: 左旋

二叉查找树

谁说我不能喝 提交于 2019-11-28 20:09:08
二叉查找树 实现 查找与插入 分析 最大键和最小键 删除最大键和最小键 我们所使用的数据结构有结点组成,结点所办韩的链接可以指向空(null)或者其他节点。在二叉树中,每个节点只能有一个父节点指向自己(只有一个例外,也就是根结点,它没有父结点),而且每个结点都只有左右两个链接,分别指向自己的左子结点和右子结点。尽管我们指向的是结点,但我们可以将每个链接看作指向了另一颗二叉树,而这棵树的根结点就是被指向的结点。因此我们可以将二叉树定义为一个空链接,或者是一个有左右两个链接的结点,每个链接都指向一颗子二叉树。 一颗二叉查找树每一个结点都含有一个Comparable的键且每个结点的键都大于其左子树中的任意结点的键而小于右子树的任意结点的键。 实现 public class BST<Key extends Comparable<Key>,Value> { private Node root;//二叉树的根节点 private class Node{ private Key key;//键 private Value val;//值 private Node left,right;//指向子树的链接 private int N;//以该节点为根的子树 public Node (Key key,Value val,int N){ this.key = key; this.val = val;

数据结构之树

时光总嘲笑我的痴心妄想 提交于 2019-11-28 16:11:32
本篇只涉及树的概念范围和应考思路,不涉及具体结构或算法的实现与思考 1.树 在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: ①每个节点有零个或多个子节点; ②没有父节点的节点称为根节点; ③每一个非根节点有且只有一个父节点; ④除了根节点外,每个子节点可以分为多个不相交的子树; 然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。 二叉树 二叉树:每个节点最多含有两个子树的树称为二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。) 在二叉树的概念下又衍生出满二叉树和完全二叉树的概念 满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上 完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。 算法实现(笑) 二叉树: private static class TreeNode {

程序员,你心里就没点树吗?

雨燕双飞 提交于 2019-11-28 06:26:32
看官,不要生气,我没有骂你也没有鄙视你的意思,今天就是想单纯的给大伙分享一下树的相关知识,但是我还是想说作为一名程序员,自己心里有没有点树?你会没点数吗?言归正传,树是我们常用的数据结构之一,树的种类很多有二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树等等,我们今天就来聊聊二叉树相关的树。 什么是树? 首先我们要知道什么是树?我们平常中的树是往上长有分支的而却不会形成闭环,数据结构中的树跟我们我们平时看到的树类似,确切的说是跟树根长得类似,我画了一幅图,让大家更好的理解树。 图1、图2都是树,图3不是树。每个红色的圆圈我们称之为元素也叫节点,用线将两个节点连接起来,这两个节点就形成了父子关系,同一个父节点的子节点成为兄弟节点,这跟我们家族关系一样,同一个父亲的叫做兄弟姐妹,在家族里面最大的称为老子,树里面也是一样的,只是不叫老子,叫做跟节点,没有子节点的叫做叶子节点。我们拿图1来做示例,A为根节点,B、C为兄弟节点,E、F为叶子节点。 一颗树还会涉及到三个概念 高度 、 深度 、 层 ,我们先来看看这三个名词的定义: 高度 :节点到叶子节点的最长路径,从0开始计数 深度 :跟节点到这个节点所经历的边数,从0开始计数 层 :节点距离根节点的距离,从1开始计数 知道了三个名词的概念之后,我们用一张图来更加形象的表示这三个概念。 以上就是树的基本概念,树的种类很多

二叉查找树的实现与讲解(C++)

只愿长相守 提交于 2019-11-27 22:21:04
注:这篇文章源于: https://mp.csdn.net/postedit/99710904 , 无需怀疑抄袭,同一个作者,这是我在博客园的账号。 在二叉树中,有两种非常重要的条件,分别是两类数据结构的基础性质。 其一是“堆性质”,二叉堆以及高级数据结构中的所有可合并堆都满足“堆 性质”。 其二是 “BST性质”,它是二叉查找树(Binary Search Tree)以及所有平衡树的基础。 二叉查找树的定义 给定一棵二叉树,树上的每个节点都带有一个数值,成为节点的 “关键码” 。所谓BST性质是指,对于树中的任意一个节点: · 该节点的关键码不小于它的左子树(如果非空)中任意节点的关键码 · 该节点的关键码不大于它的右子树(如果非空)中任意节点的关键码 满足上述性质的二叉树就是一棵“二叉查找树”(BST)。 二叉查找树的中序遍历是一个关键码单调递增的节点序列。 二叉查找树的存储 用数组模拟二叉树 1 struct node { 2 int l, r;//左右子节点在数组中的下标 3 int val;//节点关键码 4 }tree[Size];//数组模拟链表 5 int tot;//使用过和正在使用的节点总数量 6 int root;//当前根节点编号,即数组下标 优点:编程复杂度低。不需要考虑分配内存和回收内存 缺点:内存利用率低 用指针表示二叉树 1 struct node

二叉查找树(查找、插入、删除)——C语言

落爺英雄遲暮 提交于 2019-11-27 06:10:17
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本 AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,例如在在删除时, 我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,使得它的操作时间复杂度增加 例如下面这种情况: AVL树的特性让二叉搜索树的节点实现平衡

二叉查找树 BST

六眼飞鱼酱① 提交于 2019-11-27 03:20:30
一、定义: 要么二叉查找树是一棵空树 要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且 左子树 上的所有节点的数据域都 小于或等于 根结点 的数据域, 右子树 上所有节点的数据域都 大于 根结点 的数据域。 二、二叉查找树的基本操作 2.1查找操作 void search(node* root,int x){ if(root==NULL){ printf("Failed!"); return; } if(x==root->data){ printf("%d\n",root->data); }else if(x>root->data){ search(root->right,x); }else{ search(root->left,x); } } 2.2 插入操作 void insert(node* &root,int x){ if(root==NULL){ root=newNode(x); return; } if(x==root->data){ return; }else if(x<root->data){ insert(root->left,x); }else{ insert(root->right,x); } } 2.3 建立二叉查找树 node* create(int data[],int n){ node* root=NULL; for