数据结构 - 树

1. 基本概念

树( Tree )是包含n(n > 0)个结点的有穷集,其中:

  1. 每个元素称为结点( Node )。

  2. 有一个特定的结点被称为根结点或树根( Root )。

  3. 除根结点之外的其余数据元素被分为m(m ≥ 0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树。

1.1 其他定义

树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。

1.2 相关术语

名词 定义
结点的度 一个结点含有的子树的个数称为该结点的度
叶结点或终端结点 度为0的结点称为叶结点
非终端结点或分支结点 度不为0的结点
双亲结点或父结点 若一个结点含有子结点,则这个结点称为其子结点的父结点
孩子结点或子结点 一个结点含有的子树的根结点称为该结点的子结点
兄弟结点 具有相同父结点的结点互称为兄弟结点
树的度 一棵树中,最大的结点的度称为树的度
结点的层次 从根开始定义起,根为第1层,根的子结点为第2层,以此类推
高度 对于任意结点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0
深度 对于任意结点n,n的深度为从根到n的唯一路径长,根的深度为0
堂兄弟结点 双亲在同一层的结点互为堂兄弟
结点的祖先 从根到该结点所经分支上的所有结点
子孙 以某结点为根的子树中任一结点都称为该结点的子孙
森林 由m(m>=0)棵互不相交的树的集合称为森林

2. 常见树

2.1 二叉树

2.1.1 定义

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

2.1.2 特点

  • 每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点。

  • 左子树和右子树是有顺序的,次序不能任意颠倒。

  • 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

  • 二叉树的第i层最多有 2^i-1 个结点。

  • 深度为k的二叉树最多有 2^k - 1 个结点。

  • 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则 n0 = n2+1

2.1.3 遍历方法

  1. 前序遍历:规则是若二叉树为空,则空操作返回。否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。

  2. 中序遍历:规则是若树为空,则空操作返回。否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。

  3. 后序遍历:规则是若树为空,则空操作返回。否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。

  4. 层序遍历:规则是若树为空,则空操作返回。否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。

2.2 斜树

所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。

2.3 满二叉树

在一棵二叉树中。如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。

满二叉树的特点:

  • 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;

  • 第k层的结点数是:2^k-1;

  • 总结点数是:2^k - 1,且总节点数一定是奇数。

2.4 完全二叉树

若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。

满二叉树一定是一棵完全二叉树,但完全二叉树不一定是满的。

2.5 二叉查找树

又称为是二叉排序树(Binary Sort Tree)或二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  • 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

  • 它的左、右子树也分别为二叉排序树。

对二叉查找树进行中序遍历,即可得到有序的数列。

二叉查找树的时间复杂度:

它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度。原因在于插入和删除元素的时候,树没有保持平衡。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找树设计的初衷。

二叉查找树的高度决定了二叉查找树的查找效率。

具体分析及代码实现

2.6 平衡二叉树 (AVL树)

我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定。但是,在某些极端的情况下(如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。于是就有了我们下边介绍的平衡二叉树。

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:

  • 首先是一棵二叉查找树

  • 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1。

  • 并且左右两个子树都是一棵平衡二叉树。

具体分析及代码实现

2.7 2-3-4树

2-3-4树 是平衡树,但不是二叉树,因为它可以有多个节点值,也可以有多个节点。它可以实现完美平衡

2-3-4树的名字是根据子节点数来确定的。

2-3-4树的key的种类:

  • 2-node: 一个key值,两个儿子节点。

  • 3-node: 两个key值,三个儿子节点。

  • 4-node: 三个key值,四个儿子节点。

2-3-4树的子树:

  • 2-node: 左子树比key小,右子树比key大。

  • 3-node:左子树比第一个key小;中间子树比比第一个key大,比第二个key小;右子树比第二个key大。

  • 4-node:左子树比第一个key小;第二子树比比第一个key大,比第二个key小;第三子树比第二个key大,比第三个key小;右子树比第三个key大。

具体分析及代码实现

2.8 红黑树

红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目。

定义:

一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。

特点:

  • 节点是红色或黑色。

  • 根是黑色。

  • 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

  • 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

具体分析及代码实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容