创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

红黑树(Red Black Tree)是一种自平衡的二叉搜索树

TheAlgorithm 来源:算法与数据结构 2020-07-01 15:05 次阅读

红黑树(Red Black Tree)是一种自平衡的二叉搜索树(Self-balancing Binary Search Tree)。以前也叫做平衡二叉 B 树(Symmetric Binary B-tree)。

预备知识

树的知识框架结构如下图所示:

平衡二叉搜索树

平衡二叉搜索树(Balanced Binary Search Tree),英文简称 BBST。经典常见的平衡二叉搜索树是 AVL 树和红黑树。

①二叉搜索树

二叉搜索树(Binary Search Tree)是二叉树的一种,英文简称 BST。又称为二叉查找树、二叉排序树。

它的特点是任何一个结点的值都大于其左子树的所有结点的值,任何一个结点的值都小于其右子树的所有结点的值。

②平衡

平衡(Balance):就是当结点数量固定时,左右子树的高度越接近,这棵二叉树越平衡(高度越低)。而最理想的平衡就是完全二叉树/满二叉树,高度最小的二叉树。

一棵二叉搜索树平均时间复杂度可以认为是树的高度 O(h)。像左边这棵,结点的左右子树的高度接近,属于一棵平衡二叉搜索树,O(h) = O(logn);而右边这棵,高度达到了最大,已经退化成了链表,O(h)=O(n)。

③改进二叉搜索树

当二叉树退化成链表时,性能是很低的,所以我们需要在结点的插入、删除操作之后,想办法让二叉搜索树恢复平衡(减小树的高度)。

但是如果为了追求最理想的平衡,而增加了时间复杂度也不是很有必要,因此比较合理的方案就是:用尽量少的调整次数达到适度平衡。

由此引申出 AVL 树的概念。

AVL 树

AVL 树是最早发明的自平衡二叉搜索树之一,它取名自两位发明家的名字:G.M.Adelson-Velsky 和 E.M.Landis。

平衡因子(Balance Factor):某结点的左右子树的高度差。

每个叶子结点的平衡因子都是 0。看这棵二叉搜索树,红色数字标注了每个结点对应的平衡因子。

举例:8 的左子树高度为 2,右子树高度为 1,因此它的平衡因子为 1;5 的左子树高度为 0,右子树高度为 3,因此它的平衡因子为 -3;4 的左子树高度为 2,右子树高度为 4,因此它的平衡因子为 -2;

再看这棵 AVL 树和它每个结点对应的平衡因子:

可以看到 AVL 树具有以下特点:

每个结点的平衡因子只可能是 -1、0、1(如果绝对值超过 1,则认为是失衡)

每个结点的左右子树高度差不超过 1

搜索、插入、删除的时间复杂度是 O(logn)

B 树

B 树(Balanced Tree)是一种平衡的多路搜索树,多用于文件系统、数据库的实现。

这是一个简单的 3 阶 B 树:

特点如下:

1 个结点可以存储超过 2 个元素,可以拥有超过 2 个子结点

拥有二叉搜索树的一些性质

平衡,每个结点的所有子树高度一致

比较矮

①m 阶 B 树的性质(m ≥ 2)

m 阶 B 树指的是一个结点最多拥有 m 个子结点。假设一个结点存储的元素个数为 x,那么如果这个结点是:

根结点:1 ≤ x ≤ m - 1

非根结点:┌ m / 2 ┐ - 1 ≤ x ≤ m - 1

如果有子结点,子结点个数为 y = x + 1,那么如果这个结点是:

根结点:2 ≤ y ≤ m

非根结点:┌ m / 2 ┐ ≤ y ≤ m

向上取整(Ceiling),指的是取比自己大的最小整数,用数学符号 ┌ ┐ 表示;向下取整(Floor),指的是取比自己小的最大整数,用数学符号 └ ┘ 表示。 比如 m=3,子结点个数 2≤y≤3,这个 B 树可以称为(2,3)树、2-3 树。 比如 m=4,子结点个数 2≤y≤4,这个 B 树可以称为(2,4)树、2-3-4 树。

比如 m=5,子结点个数 3≤y≤4,这个 B 树可以称为(3,5)树、3-4-5 树。

以此类推。

②B 树 VS 二叉搜索树

这是一棵二叉搜索树,通过某些父子结点合并,恰好能与上面的 B 树对应。

我们可以得到结论:

B 树和二叉搜索树,在逻辑上是等价的

多代结点合并,可以获得一个超级结点,且 n 代合并的超级结点,最多拥有 (2^n) 个子结点 (至少是 (2^n) 阶 B 树)

红黑树定义和性质

红黑树是一种含有红黑结点并能自平衡的二叉搜索树。

为了保证平衡,红黑树必须满足以下性质:

每个结点是要么是红色或黑色

根结点必须是黑色

叶结点(外部结点、空结点)是黑色

红色结点不能连续(也就是,红色结点的孩子和父亲都是黑色)

对于每个结点,从该点至nil(树尾端,Java 中为null的结点)的任何路径都包含所相同个数的黑色结点

红黑树与 B 树的等价变换

根据上面的性质,可以画出这样一棵红黑树。接下来对红黑树做等价变换,即将所有的红色结点上升一层与它的父结点放在同一行,这就很像一棵 4 阶 B 树,转换效果如下图所示。

可以得出结论:

红黑树与 4 阶 B 树(2-3-4树)具有等价性

黑色结点与红色子结点融合在一起,形成 1 个 B 树结点

红黑树的黑色结点个数与 4 阶 B 树的结点总个数相等

红黑树的基本操作

当我们对一棵平衡二叉搜索树进行插入、删除的时候,很可能会让这棵树变得失衡(最坏可能导致所有祖先结点失衡,但是父结点和非祖先结点都不可能失衡)。

为了达到平衡,需要对树进行旋转。而红黑树能够达到自平衡,靠的也就是左旋、右旋和变色。

旋转操作是局部的。当一侧子树的结点少了,向另一侧“借”一些结点;当一侧子树的结点多了,则“租”一些结点给另一侧。

为了更清楚地讲解这部分内容,先声明几个概念:

N-node:当前结点

P-parent:父结点

S-sibling:兄弟结点

U-uncle:叔父结点(P 的兄弟结点)

G-grand:祖父结点(P 的父结点)

左旋

左旋指的是以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。

不考虑结点颜色,可以看到左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树移动。

右旋

右旋指的是以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。

不考虑结点颜色,可以看到右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树移动。

变色

变色指的是结点的颜色由红变黑或由黑变红。

变换规则

将左旋、右旋和变色结合起来,得到一套变换规则。

变色:如果当前结点的父结点和叔父结点是红色,那么:

把父结点和叔父结点变为黑色

把祖父结点变为红色

把指针定义到祖父结点

左旋:当前结点是右子树,且父结点是红色,叔父结点是黑色,对它的父结点左旋。

右旋:当前结点是左子树,且父结点是红色,叔父结点是黑色,那么:

把父结点变为黑色

把祖父结点变为红色

对祖父结点右旋

红黑树搜索

由于红黑树本来就是平衡二叉搜索树,并且搜索也不会破坏树的平衡,所以搜索算法也与平衡二叉搜索树一致:

具体步骤如下:

从根结点开始检索,把根结点设置为当前结点。

若当前结点为空,返回 nil。

若当前结点不为空,比较当前结点 key 与搜索 key 的大小。

若当前结点 key 等于搜索 key,那么该 key 就是搜索目标,返回当前结点。

若当前结点 key 大于搜索 key,把当前结点的左子结点设置为当前结点,重复步骤 2。

若当前结点 key 小于搜索 key,把当前结点的右子结点设置为当前结点,重复步骤 2。

红黑树插入

红黑树插入操作分为下面两步:

定位插入的位置

具体步骤如下:

从根结点开始检索。

若根结点为空,那么插入结点设为根结点,结束。

若根结点不为空,那么把根结点设为当前结点。

若当前结点为 nil,返回当前结点的父结点,结束。

若当前结点 key 等于搜索 key,那么该 key 所在结点就是插入结点,更新结点的值,结束。

若当前结点 key 大于搜索 key,把当前结点的左子结点设置为当前结点,重复步骤 4。

若当前结点 key 小于搜索 key,把当前结点的右子结点设置为当前结点,重复步骤 4。

插入后实现自平衡

建议新添加的结点默认为红色,因此这样能够让红黑树的性质尽快满足。不过如果添加的结点是根结点,设为黑色即可。

总结一下红黑树插入可能出现的所有场景:

①场景 1:红黑树为空树

红黑树的性质 2:根结点必须是黑色。

处理:直接把插入结点设成黑色并作为根结点。

②场景 2:插入结点的 key 已存在

二叉搜索树中不能插入相同元素,既然结点的 key 已经存在,红黑树也已平衡,无需重复插入。 处理:

将插入结点设为将要替换结点的颜色

更新当前结点的值为插入结点的值

③场景 3:插入结点的父结点为黑色

插入的结点默认是红色的,当它的父结点是黑色时,并不会破坏平衡。 处理:直接插入。 ④场景 4:插入结点的父结点为红色

如果插入结点的父结点为红色,那么父结点不可能为根结点,所以插入结点总是存在祖父结点。这点很重要,后续的旋转操作需要祖父结点的参与。 场景 4.1:存在叔父结点,且为红色

由红黑树性质 4 可知:红色结点不能连续。那么此时该插入子树的红黑层数的情况是:黑-红-红。显然最简单的处理方式就是将其改为:红-黑-红。

处理:

将父结点和叔父结点变为黑色

将祖父结点变为红色

将祖父结点设置为当前插入结点

场景 4.2:叔父结点不存在或为黑色,插入结点的父结点是祖父结点的左子结点这种场景下,叔父结点所在的子树的黑色结点就比父结点所在子树的多,不满足红黑树的性质 5。

场景 4.2.1:插入结点是左子树

处理:

将父结点变为黑色

将祖父结点变为红色

将祖父结点右旋

场景 4.2.2:插入结点是左子树

这种场景显然可以转换为 4.2.1。

处理:

将父结点进行左旋

将父结点设为插入结点,得到场景 4.2.1

进行场景 4.2.1 的处理

场景 4.3:叔父结点不存在或为黑色,插入结点的父结点是祖父结点的右子结点相当于场景 4.2 的方向反转,直接看图。

场景 4.3.1:插入结点是左子树

处理:

将父结点变为黑色

将祖父结点变为红色

对祖父结点进行左旋

场景 4.3.2:插入结点是右子树

处理:

将父结点进行右旋

将父结点设置为插入结点,得到场景 4.3.1

进行场景 4.3.1 的处理

下面举个例子,往一棵红黑树中插入元素,整棵树的变换如下图所示:

红黑树删除

红黑树删除操作也分为两步:

定位删除的位置

定位删除位置可以复用红黑树搜索的操作。

如果不存在目标结点,忽略本次操作;如果找到目标结点,删除后进行自平衡处理。

删除后实现自平衡

二叉搜索树删除的时候可能出现三种场景:

若删除结点无子结点,直接删除即可。

若删除结点只有一个子结点,用子结点替换删除结点。

若删除结点有两个子结点,用**后继结点(大于删除结点的最小结点)**替换删除结点。

具体应用,可以借助这张图理解:

我们可以发现,另外两种二叉树的删除场景都可以通过相互转换变为场景一。 在场景二情况下:删除结点用其唯一的子结点替换,子结点替换为删除结点后,可以认为删除的是子结点,若子结点又有两个子结点,那么相当于转换为场景三,一直自顶向下转换,总是能转换为场景一。

在场景三情况下:删除结点用后继结点,如果后继结点有右子结点,那么相当于转换为场景二,否则转为场景一。

综上所述,删除的结点可以看作删除替换结点,且替换结点最后总是在树末。

下面总结一下红黑树删除可能出现的所有场景:

为了方面理解,我们先约定一下结点的叫法:

R:替换结点

P:替换结点的父结点

S:替换结点的兄弟结点

SL:兄弟结点的左子结点

SR:兄弟结点的右子结点

灰色:结点颜色可能是红色,也可能是黑色

注意:R 是即将被替换到删除结点的位置的替换结点,在删除前,它还在原来所在位置参与树的子平衡,平衡后再替换到删除结点的位置,才算删除完成。 ①场景 1:替换结点为红色 我们把替换结点换到了删除结点的位置时,由于替换结点为红色,删除也了不会影响红黑树的平衡,只要把替换结点的颜色变为删除的结点的颜色即可重新平衡。

处理:替换结点颜色变为删除结点的颜色。

②场景 2:替换结点为黑色

当替换结点是黑色时,就必须进行自平衡处理了,我们可以通过区分替换结点是其父结点的左子结点还是右子结点,来做不同的旋转,使树重新平衡。

场景 2.1:替换结点是左子树场景 2.1.1:替换结点的兄弟结点为红色

若兄弟结点是红结点,那么根据红黑树性质 4,兄弟结点的父结点和子结点肯定为黑色,按照下图方式处理,得到删除场景 2.1.2.3。

处理:

将兄弟结点变为黑色

将父结点变为红色

对父结点进行左旋,得到场景 2.1.2.3

进行场景 2.1.2.3 的处理

场景 2.1.2:替换结点的兄弟结点为黑色 当兄弟结点为黑时,其父结点和子结点的具体颜色也无法确定,此时又得考虑多种子场景。

场景 2.1.2.1:替换结点的兄弟结点的右子结点为红色,左子结点任意颜色

即将删除的左子树的一个黑色结点,显然左子树的黑色结点少 1 了,然而右子结点又是红色,那么我们直接向右子树“借”个红结点来补充黑结点,并进行旋转处理。

如图所示:

处理:

将兄弟结点的颜色变为父结点的颜色

将父结点变为黑色

将兄弟结点的右子结点变为黑色

对父结点进行左旋

场景 2.1.2.2:替换结点的兄弟结点的右子结点为黑色,左子结点为红色 兄弟结点所在的子树有红结点,又可以向兄弟子树“借”个红结点过来,这就转换回了场景 2.1.2.1。

如图所示:

处理:

将兄弟结点变为红色

将兄弟结点的左子结点变为黑色

对兄弟结点进行右旋,得到场景 2.1.2.1

进行场景 2.1.2.1 的处理

场景 2.1.2.3:替换结点的兄弟结点的子结点都为黑色

兄弟子树没有红结点可以“借”了,再向父结点“借”。如果父结点是黑色,为了让父结点在所在的子树中保证平衡(替换结点即将删除,少了一个黑色结点,子树也需要少一个)先把兄弟结点变为红色,再让父结点成为新的替换结点。

处理:

如果父结点为黑色:将兄弟结点变为红色;将父结点作为新的替换结点;重新进行删除结点的场景处理。

如果父结点为红色:替换结点的父结点和替换结点的兄弟结点颜色交换;删除结点和替换结点的值交换后,删除替换结点。

场景 2.2:替换结点是右子树

实际上是场景 2.1 的镜像操作。

场景 2.2.1:替换结点的兄弟结点为红色

处理:

将兄弟结点变为黑色

将父结点变为红色

对父结点进行右旋,得到场景 2.2.2.3

进行场景 2.2.2.3 的处理

场景 2.2.2:替换结点的兄弟结点为黑色场景 2.2.2.1:替换结点的兄弟结点的左子结点为红色,右子结点任意颜色

处理:

将兄弟结点的颜色变为父结点的颜色

将父结点变为黑色

将兄弟结点的左子结点变为黑色

对父结点进行右旋

场景 2.2.2.2:替换结点的兄弟结点的左子结点为黑色,右子结点为红色

处理:

将兄弟结点变为红色

将兄弟结点的右子结点设为黑色

对兄弟结点进行左旋,得到场景 2.2.2.1

进行场景 2.2.2.1 的处理

场景 2.2.2.3:替换结点的兄弟结点的子结点都为黑色

处理:

如果父结点为黑色:将兄弟结点变为红色;将父结点作为新的替换结点;重新进行删除结点的场景处理。

如果父结点为红色:替换结点的父结点和替换结点的兄弟结点颜色交换;删除结点和替换结点的值交换后,删除替换结点。

  • 二叉树
    +关注

    关注

    0

    文章

    43

    浏览量

    11059
  • null
    +关注

    关注

    0

    文章

    6

    浏览量

    2237

原文标题:面试被问“红黑树”,我一脸懵逼......

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    调试发布版RT-Thread4.1.0内存分配为NULL的问题怎么解决

    在调试发布版4.1.0的时候,遇到问题: 调用RT_KERNEL_MALLOC object = (struct rt_object *)RT_KERNEL_...
    发表于 04-29 09:34 1728次 阅读

    二叉树的最小深度

    遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
    的头像 算法与数据结构 发表于 04-28 16:27 455次 阅读

    DataAbilityHelper.creator()创建实例失败怎么解决

    SDK版本是5,但是调用DataAbilityHelper.creator()获取方法实例的时候,获取不成功,为null。 ...
    发表于 04-26 11:08 1121次 阅读

    C语言数据结构:什么是二叉树?

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
    的头像 C语言编程学习基地 发表于 04-21 16:20 452次 阅读

    如何使用 go 实现红黑树

    二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
    的头像 Linux爱好者 发表于 03-21 11:54 379次 阅读

    介绍assert的使用方法

    很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使....
    的头像 Linux爱好者 发表于 03-17 14:06 610次 阅读

    TabList find为什么总是返回null?

    TabList为什么findComponentById返回null 在xml中已经定义过了,发现总是返回null ...
    发表于 03-16 14:12 2109次 阅读

    为什么C语言要避免使用Null指针呢

    为什么C语言要避免使用Null指针呢? 指针作为数组的应用有哪些呢? ...
    发表于 12-20 07:19 696次 阅读

    二叉树上应该怎么求

      二叉树上应该怎么求,二叉搜索树上又应该怎么求? 在求众数集合的时候有一个技巧,因为题目中众数是可....
    的头像 算法与数据结构 发表于 11-22 11:32 579次 阅读

    数据结构与算法分析中的二叉树与堆有关知识汇总

    该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
    发表于 11-03 09:37 139次 阅读

    二叉排序树AVL如何实现动态平衡

      什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
    的头像 算法与数据结构 发表于 10-28 17:02 629次 阅读
    二叉排序树AVL如何实现动态平衡

    算法学习中如何打印二叉树节点

    大家好,我是吴师兄,直接开始今天的算法学习,冲冲冲。 一、题目描述 从上到下打印出二叉树的每个节点,....
    的头像 算法与数据结构 发表于 10-22 09:37 683次 阅读

    如何修剪二叉搜索树

      如果不对递归有深刻的理解,本题有点难。单纯移除一个节点那还不够,要修剪! 669. 修剪二叉搜索....
    的头像 算法与数据结构 发表于 10-11 14:16 607次 阅读

    C++基础语法中的二叉树详解

    本期是C++基础语法分享的第十四节,今天给大家来梳理一下树!   二叉树 BinaryTree.cp....
    的头像 C语言编程学习基地 发表于 09-29 18:02 1101次 阅读

    如何才能够翻转二叉树

    这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 但正是因为这道题太简单,一看就会,一....
    的头像 新材料在线 发表于 09-01 11:45 920次 阅读

    如何去使用多线程下的互斥量

    #include#include#includeusing namespace std;HANDLE g_hMutex = NULL;HANDLE g_hEvent = NULL;int is_s...
    发表于 08-24 08:04 269次 阅读

    C语言编程中如何求出二叉树后序遍历

    题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....
    的头像 C语言编程基础 发表于 08-23 11:04 2840次 阅读

    二叉树的所有路径介绍

    以为只用了递归,其实还用了回溯 257. 二叉树的所有路径 题目地址:https://leetcod....
    的头像 新材料在线 发表于 08-13 17:51 1480次 阅读
    二叉树的所有路径介绍

    Java程序员最容易犯的10个SQL错误是哪些

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编....
    的头像 city_prolove 发表于 06-07 15:59 964次 阅读

    二叉树的前序遍历非递归实现

    我们之前说了二叉树基础及二叉的几种遍历方式及练习题,今天我们来看一下二叉树的前序遍历非递归实现。 前....
    的头像 算法与数据结构 发表于 05-28 13:59 745次 阅读

    数据库字段要使用NOT NULL究竟是为何?

    最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来....
    的头像 数据分析与开发 发表于 04-19 15:24 1808次 阅读
    数据库字段要使用NOT NULL究竟是为何?

    面试官考点之索引是什么?

    可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不....
    的头像 数据分析与开发 发表于 03-05 10:37 1103次 阅读
    面试官考点之索引是什么?

    建立决策树的逻辑

    像上面的这样的二叉树状决策在我们生活中很常见,而这样的选择方法就是决策树。机器学习的方法就是通过平时....
    的头像 深度学习自然语言处理 发表于 10-10 10:44 1536次 阅读
    建立决策树的逻辑

    Max Howell因为不会翻转一棵二叉树,被Google拒绝

    Max Howell 就是 Homebrew 的创作者,也是一名业内知名的 MacOS / iOS ....
    的头像 算法与数据结构 发表于 09-03 10:52 9785次 阅读

    Offer系列面试题0:重建二叉树

    以本题的序列为例,前序遍历序列的第一个数字 3 就是根结点的值,在中序遍历序列,找到根结点值的位置。....
    的头像 算法与数据结构 发表于 07-09 15:03 928次 阅读
    Offer系列面试题0:重建二叉树

    删除二叉搜索树中的节点

    因为是二叉搜索树,对于树上每个节点来说,其 右子树的节点都要大于其左子树的节点 ,那么要找对应节点,....
    的头像 算法与数据结构 发表于 06-23 10:33 2023次 阅读
    删除二叉搜索树中的节点

    请问如何判断一个任务是否存在或者已经删除?

    有些任务运行一次之后为了节省内存会自动删除,需要使用时再创建,请问怎么确定这个任务已经删除,从而避免重复创建? 我使用了...
    发表于 06-09 09:11 1594次 阅读

    一个数据结构-线段树

    对于求区间和的问题,前缀和数组 是一个不错的选择,构建好前缀和数组后,求一个区间和的话只要前后一减就....
    的头像 算法与数据结构 发表于 05-06 11:02 2178次 阅读
    一个数据结构-线段树

    通过NULL指针进行的间接函数调用被忽略

    你好,我移植了一些第三方(微芯片)代码到XC8,我唯一要解决的问题是这个警告。尽管是一个警告,但“表达式不会生成代码”,它...
    发表于 03-26 07:57 827次 阅读

    C++重载new申请堆空间函数会返回NULL?

    这个函数对new进行重载,固定返回NULL那么如果外部用new重载以后就算申请堆空间成功是不是还是会返回NULL? ...
    发表于 03-26 00:40 766次 阅读

    如何对NULL指针地址建立合法映射,从而合法访问NULL指针

    谁能说出哪个虚拟地址是合法的,哪个是非法的?谁也说不出,只有试着访问它的时候才知道,引发segfau....
    的头像 Linux阅码场 发表于 11-29 14:26 2526次 阅读

    面试二叉树看这11个就够了

    根据前、中序遍历的特点,(根左右、左根右),先根据前序遍历确定根节点,然后在中序遍历知道该根节点的左....
    的头像 算法与数据结构 发表于 11-27 16:25 2650次 阅读

    面试算法之重建二叉树

    那么问题来了,只知道前序遍历能不能反推二叉树呢?我们就试一下,比如题目中所述,{1,2,4,7,3,....
    的头像 算法与数据结构 发表于 11-27 15:59 1838次 阅读

    变量是否自动初始化为null?

    >变量是否自动初始化为null?取决于您的配置方式。 在File-> Default Preferences下,如果选中PreRun的Delete Variables...
    发表于 10-23 08:14 1269次 阅读

    C6748在stareware中有ENET_ECHO实例但不能正常使用?

    C6748 在stareware中有ENET_ECHO实例无法正常使用? 1. 首先,将开发板与电脑用网线连接;开发板的IP地址为192.168...
    发表于 09-12 10:09 1018次 阅读

    一份用Python代码实现算法的资源帖,涵盖从入门到高级的各类算法

    在这个项目中并不是对所有内容都进行了详细介绍,有部分主题的代码非常丰富。为了帮助大家高效地利用这一学....
    的头像 city_prolove 发表于 05-11 10:30 2163次 阅读
    一份用Python代码实现算法的资源帖,涵盖从入门到高级的各类算法

    二叉树,一种基础的数据结构类型

    然后我们再定义一棵深度也为 3 的二叉树,该二叉树的 n 个结点(n≤7),当从 1 到 n 的每个....
    的头像 人工智能头条 发表于 04-13 10:48 3091次 阅读
    二叉树,一种基础的数据结构类型

    数据结构与算法:图的遍历过程中,搜索方法的不同

    图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶....
    的头像 city_prolove 发表于 04-04 16:40 2759次 阅读
    数据结构与算法:图的遍历过程中,搜索方法的不同

    普及一下程序猿们经常遇见的树

    趁着这个植树节,普及一下程序猿们经常遇见的树。B树的插入会发生结点的分裂操作。当插入操作引起了 s ....
    的头像 city_prolove 发表于 03-13 09:31 2233次 阅读

    基于二叉树的ensemble异常检测算法

    xi样本点的isolation需要大概12次划分,而异常点x0指需要4次左右。因此,我们可以根据划分....
    的头像 人工智能爱好者社区 发表于 12-11 16:57 3017次 阅读
    基于二叉树的ensemble异常检测算法

    4中二叉树的遍历方式介绍

    对于一种数据结构而言,遍历是常见操作。二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2....
    的头像 人工智能爱好者社区 发表于 04-27 17:23 3855次 阅读
    4中二叉树的遍历方式介绍

    B-Tree与二叉查找树的对比

    从前面分析情况来看,减少磁盘IO的次数就必须要压缩树的高度,让瘦高的树尽量变成矮胖的树,所以B-Tr....
    的头像 Linux阅码场 发表于 04-15 10:54 7837次 阅读
    B-Tree与二叉查找树的对比

    关于二叉树一些数据结构和算法相关的题目

    最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的。
    的头像 算法与数据结构 发表于 02-07 13:57 2471次 阅读

    一文详解红黑树

    红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发....
    的头像 算法与数据结构 发表于 02-02 17:25 3512次 阅读
    一文详解红黑树

    熵的二叉树多类支持向量机的漏洞分类

    为了有效提高漏洞分类的准确性,针对基于二叉树多类支持向量机分类算法的分类复杂性和分类结果依赖二叉树的....
    发表于 01-25 10:40 643次 阅读

    AVL 树和普通的二叉查找树的详细区别分析

    那 AVL 树和普通的二叉查找树有何区别呢?如图,如果我们插入的是一组有序上升或下降的数据,则一棵普....
    的头像 算法与数据结构 发表于 01-15 14:36 4254次 阅读
     AVL 树和普通的二叉查找树的详细区别分析

    基于二叉树的多用户ORAM改进方案

    随着大数据及数据挖掘技术的发展,云计算环境中用户访问模式成为泄露用户隐私的一条途径.不经意随机存取技....
    发表于 01-13 11:05 415次 阅读

    基于二叉树的算术编码二值化方法

    在算术编码研究中,待编码的语法元素需要采用何种二值化方法以及二值化后每个比特的概率模型选择是算术编码....
    发表于 01-03 16:53 471次 阅读

    基于二叉树的电子系统故障诊断专家系统

    在分析专家系统发展及其在电子系统故障诊断中应用状况的基础上,针对当前装甲装备电子系统故障诊断中先进的....
    发表于 12-13 14:51 528次 阅读
    基于二叉树的电子系统故障诊断专家系统

    JDK8 Optional类新特性

    Optional不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现。 Nu....
    发表于 11-28 14:33 1330次 阅读

    二叉树层次遍历算法的验证

    实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,....
    发表于 11-28 01:05 1351次 阅读
    二叉树层次遍历算法的验证

    二叉树的前序遍历、中序遍历、后续遍历的非递归实现

    前序遍历:先访问该节点,然后访问该节点的左子树和右子树; 中序遍历:先访问该节点的左子树,然后访问....
    发表于 11-27 11:24 736次 阅读

    二叉树基本操作课程设计

    课程设计
    发表于 10-12 08:50 408次 阅读

    二叉树实验报告_数据结构

    发表于 06-25 16:19 510次 阅读

    基于二叉树的时序电路测试序列设计

    为了实现时序电路状态验证和故障检测,需要事先设计一个输入测试序列。基于二叉树节点和树枝的特性,建立时....
    发表于 07-12 13:57 621次 阅读
    基于二叉树的时序电路测试序列设计

    基于二叉树满足MC DC测试用例设计方法

    软件测试是保证软件质量的有效方法,但测试工作过程繁琐,工作量较多。探索高效、可靠的测试用例设计方法一....
    发表于 03-01 16:22 610次 阅读

    二叉树算法在单总线上的C51 软件实现The Impleme

    单总线技术是一种新技术,由于所有的单总线器件均并联在一条信号线上,其信号传输较慢,主要应用于低速测控....
    发表于 06-01 11:20 442次 阅读