Fork me on GitHub

数据结构与算法——树

1. 什么是树:

树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除 了根结点外,每个子结点可以分为多个不相交的子树;

 

 

 

2. 树的原理

和线性表一样,一个没有限制的线性表应用范围可能有限,但是我们对线性表进行一些限制就可 以衍生出非常有用的数据结构如栈、队列、优先队列等。树也是一样,一个没有限制的树由于太灵活,控制起来比较复杂。如果对普通的树加上一些人为的限制,比如 节点只允许有两个子节点,这就是我们接下来要介绍的二叉树。

 

二叉树是一个每个结点最多只能有两个分支的树,左边的分支称之为左子树,右边的分支称之为右子树。

 

2.1 在非空二叉树中,第 i-1 层的结点总数不超过 2i-1 , i>=1

2.2 深度为 h-1 的二叉树最多有 2h-1 个结点 (h>=1),最少有 h 个结点;

2.3 对于任意一棵二叉树,如果其叶结点数为 N0,而度数为 2 的结点总数为 N2,则 N0=N2+1

 

3. 常见二叉树分类

3.1 完全二叉树

若设二叉树的高度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有叶 子节点,并且叶子结点都是从左到右依次排布,这就是完全二叉树(堆就是完全二叉树)。

相关代码实现:

数据结构与算法——堆 特点与算法实现(一)

数据结构与算法——堆 特点与算法实现(二) 

 

 

 

 

 3.2 满二叉树

除了叶结点外每一个结点都有左右子节点且叶子结点都处在最底层的二叉树。

 

 

 

3.3 平衡二叉树

又被称为 AVL 树,它是一颗空树或左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都 是一棵平衡二叉树。

 

 

3.4 二叉搜索树

又称二叉查找树、二叉排序树(Binary Sort Tree)。它是一颗空树或是满足下列性质的二叉树:

3.4.1 若左子树不空,则左子树上所有节点的值均小于或等于它的根节点的值;

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

3.4.3 左、右子树也分别为二叉排序树。

相关代码实现:二叉搜索树的算法实现

 

 3.5 红黑树

是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:

3.5.1 它必须是一个二叉搜索树,满足 3.4 中二叉搜索树的条件;

3.5.2 节点是红色或黑色;

3.5.3 根节点是黑色;

3.5.4 所有叶子节点都是黑色;

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

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

相关代码实现:红黑树的算法实现

 

posted @ 2020-11-13 16:53  索智源  阅读(221)  评论(0编辑  收藏  举报