Refresh

This website blog.gomyck.com/2019/07/21/binaryTree/ is currently offline. Cloudflare\'s Always Online™ shows a snapshot of this web page from the Internet Archive\'s Wayback Machine. To check for the live version, click Refresh.

二叉树学习笔记

算法 数据结构 二叉树

Posted by gomyck on July 21, 2019

二叉树的数据结构以及其相关特性整理

树相关知识

结点概念

结点是数据结构中的基础, 是构成复杂数据结构的基本组成单位, 本文中的节点只树节点, 为一个数据单元

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
名词解释:

树: N个有父子关系的节点的有限集合, 与堆, 栈, 队列不同, 树是一种非线性的集合
    1)有且仅有一个特定的称为根(Root)的结点;
    2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。

节点: 组成树的每个元素点为节点, 通常包含一个 [数据包] 以及 [若干指针] 指向其他节点

度(节点): 节点拥有的子树的数量叫做节点的度

度(树): 所有节点的度的和为树的度

子节点: 当前节点 子树 的 根节点 为当前节点的子节点

父节点: 参照 [子节点] , 拥有子节点的当前节点为子节点的父节点

层次(level): 从根节点算起, 根节点为1, 其余节点的层次为当前节点的父节点+1

深度(depth): 最大层次为深度

祖先节点: 从根节点到当前节点经过的所有节点

后代节点: 以当前节点为根节点的子树包含的所有节点为当前节点的后代节点

image

image

1
2
3
4
树的特性:

1.任意非空的树有且仅有一个根节点
2.一棵树由 根 和 若干个子树 组成, 每个子树也可有由若干个子树组成
1
2
3
4
5
6
7
8
节点的分类:

1.以父节点为参照:
  有父节点: 普通节点
  无父节点: 根节点
2.以子节点为参照:
  有子节点: 普通节点
  无子节点: 叶子节点

二叉树:

二叉树定义:

从根节点开始, 每个节点最多拥有两个子节点的有序树

二叉树的特性:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
分左右树, 左边的子树为[左子树], 右侧为[右子树]

节点最大的 度 为2 -> 最多有两个子树 [子节点]

一颗二叉树如果包含了2^K - 1 个节点 [k为当前树深度] , 当前树为 [满二叉树]

一颗 深度为K 的二叉树, 按每层从左到右依次编号, 若此二叉树的编号 与 深度同样为K的满二叉树以同样的规则的编号完全一致, 当前树为完全二叉树

二叉树第i层上的节点数据至多为2的i-1次方

具有n个节点的满二叉树的深度为log2 (n+1)

深度为k的二叉树至多有2的k次方-1个节点.满二叉树的每层节点的数量依次为1, 2, 4, 8,…,因此深度为k的满二叉树包含的节点数为公比为2的等比数列的前k项总和,即2的k次方一1。

在任何一棵二叉树中,如果其叶子节点的数量为x, 度为2的子节点数量为y,则x=y + 1。这是因为:如果为任意叶子节点增加一个子节点,则原有叶子节点变成非叶子节点,新增节点变成叶子节点,上述等式不变;如果为任意叶子节点增加两个子节点,则原有叶子节点变成度为2的非叶子lto点,新增的两个节点变成叶子节点,上述等式依然不变。

满二叉树

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

image

满二叉树

image

完全二叉树

对于一颗具有n个节点的完全二叉树的节点按层自左向右编号,则对任一编号为i(n>=i>=1)的节点有下列性质:
1
2
3
4
5
6
7
当i==1时,节点i是二叉树的根;若i>1,则节点的父节点是i/2

若2i<n,则节点i有左子节点,左子节点的编号是2i;否则,节点无左子节点,并且是叶子节点

若2i+1<=n,则节点i有右子节点,右子节点的编号是2i+1;否则,节点无右子节点。

1~n/2范围的节点都是有子节点的非叶子节点,其余的节点全部都是叶子节点。编号为n/2的节点可能只有左子节点,也可能即有左子节点,又有右子节点。
对于数组实现的二叉树, 使用顺序存储可避免空间浪费, 即按每层从左至右存储, 但是如果存储的二叉树为不完全二叉树, 就会出现存储浪费, 所以二叉树的存储, 不推荐使用数组
二叉树的二叉链表的实现:
1
2
left point || val || right point
左侧子节点指针, 数据, 右侧子节点指针

遍历方式:

1
2
3
4
5
6
L为左子树 R为右子树 D为根节点
广度遍历: 按照规则, 按层遍历(层序遍历)
深度遍历: 按照一定的规则, 一直向下遍历
先序遍历: DLR
中序遍历: LDR
后序遍历: LRD

多叉树转二叉树:

1
2
3
加虚线: 同一个父节点的相邻兄弟节点之间加虚线
抹实线: 每个节点只保留它与最左子节点的连线,与其他字节点的连线都被抹掉。
虚改实: 虚线改为实线

image

二叉查找树

1
2
3
4
5
6
二叉查找树,也称有序二叉树(ordered binary tree),或已排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

若任意节点的左子树不空, 则左子树上所有结点的值均小于它的根结点的值
若任意节点的右子树不空, 则右子树上所有结点的值均大于它的根结点的值
任意节点的左、右子树也分别为二叉查找树
没有键值相等的节点(no duplicate nodes)

红黑树

1
2
3
算法导论对R-B Tree的介绍:
红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

结束语:

通过以上文章的阅读, 可以初步掌握二叉树的基本原理以及相关特性, 在实际的开发应用当中, 二叉树的身影随处可见(collection, memory cache, database), 它被包装了一层语法糖, 我们要善于发现并掌握其中原理, 这样在提升自己的同时, 还可以极大的提高程序的运行效率, 关于红黑树, B树等比高级的算法, 留待以后继续钻研讨论