数据结构-树(上)

什么是树?

(Tree)是一种由n个节点组成的具有层次关系的抽象数据结构,因其看起来像一个倒立的树而得名。它具有以下的特点:

为什么要使用树?

为什么要使用树,我们可以从两个面来分析:

树相关的基本概念

树的基本概念

树的分类

树族谱

树族谱相关简介:

接下来我将一一介绍树族谱中的所有树。

二叉树(Binary Tree)

首先我们来看树族谱中最大的一个分支:二叉树(Binary Tree)。

斜树

左斜树:所有的节点都在左子树。

右斜树:所有的节点都在右子树。

左/右斜树

满二叉树(Perfect Binary Tree)

满二叉树又称完美二叉树,其叶子节点都在同一层,所有的非叶子节点都有两个子节点。

满二叉树

完全二叉树(Complete Binary Tree)

除了最后一层之外的其它每一层都被完全填充,且所有的叶子节点向左紧密排列。

完全二叉树

完满二叉树(Full/Strictly Binary Tree)

除了叶子节点之外的所有节点都有两个叶子节点。

完满二叉树

二叉查找树(Binary Search Tree)

二叉查找树又称二叉搜索树、二叉排序树、BST。二叉查找树有以下明显特征:

从上面的两个特性可以总结出,二叉查找树的任意子树都是一个二叉查找树。

二叉查找树

操作时间复杂度:

使用场景:

二叉查找树在最坏的情况下竟然和顺序查找效率相当了,造成这种情况的主要原因就是二叉查找树不够平衡,在树足够大时,左右子树的高度差就会非常大,为了解决这一问题,平衡树诞生了。

平衡二叉树(AVL Tree)

平衡二叉树又称平衡二叉查找树、平衡二叉排序树、AVL树。平衡二叉树具有以下特性:

平衡二叉树

操作时间复杂度:

使用场景:

平衡二叉树的严格平衡策略换来的查询时间复杂度,其代价也非常的昂贵,它的代价是以牺牲其插入和删除性能换来的。我们更希望找到一种更加折中的策略,也就是既能减少平衡策略所带来的额外开销,又能保证高效的查询效率,红黑树应运而生。

红黑树(Red Black Tree)

红黑树是一种含有红、黑两种节点,并且自平衡的二叉查找树,其具有以下性质:

红黑树

操作时间复杂度:

使用场景:

关于红黑树的旋转变色算法,本文将不过多阐述,后续会在数据结构系列博文详细讲解。

替罪羊树(Scapegoat Tree)

替罪羊树是一种基于部分重建的自平衡二叉查找树,其关键点就在于部分重构。它的平衡策略不同于AVL树、红黑树等的旋转策略,它是所有平衡树中思路最简单的一种结构,它的策略是:

替罪羊树重构过程

操作时间复杂度:

使用场景:

伸展树(Splay Tree)

伸展树也是一种自平衡的二叉查找树,它继承二叉查找树的性质,具体如下:

伸展树

在执行查询、删除或者插入操作之后,伸展树将执行伸展操作,通过旋转操作将特定的元素放置到树的根部(结合特性3是不是第一时间就想到了LRU缓存算法,唯一不同的是伸展树不会淘汰数据),越热的数据就在树的根部周围,冷数据则在树的底部。

操作时间复杂度:

使用场景:

树堆(Treap)

树堆Treap一词是由Tree与Heap二词合成而来,它本身是一颗二叉查找树,它具有以下特性:


树堆

如上图,字母是按照二叉查找树的规则排列;而红色的数字是优先级,按照堆性质排列的。当每次插入新的节点会为其随机生成一个优先级,堆性质的维护使用到了旋转,这与其它平衡二叉树的操作基本一样。但与其它平衡类二叉树最大的不同在于,在所有节点优先级不变的情况下,不管是序列化后再反序列化,还是其它符合要求的操作,最终得到的树都是一样的。

操作时间复杂度:

使用场景:

总结

受篇幅的影响,本文只介绍了树族谱中最大的一个分支二叉树相关的数据结构,后续还会介绍一些其它类型二叉树以及多路查找树。

以上就是本章介绍的所有内容,后续的博文中我会介绍更多相关数据结构,如果你看了本文后有所收获就请给作者一个关注+点赞吧![送心]

展开阅读全文

页面更新:2024-04-28

标签:数据结构   子树   复杂度   族谱   替罪羊   优先级   节点   叶子   操作   时间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top