Java源码集合类TreeMap学习1——数据结构2
2017-04-16 22:52
591 查看
二叉树的定义
二叉树(Binary Tree)是另一种树型结构,它的特点是每个节点至多只有两颗子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次数不能任意颠倒。如下图。
二叉树的性质
性质1 在二叉树的第i层上至多有2i-1个节点(i>=1)。
证明(归纳法):
1. i = 1时,显然节点数等于1。
2. 假定所有的j,1<=j<i,命题成立,即第j层上至多有2^j-1个节点。那么,可以证明j = i时命题也是成立。
3.有归纳法假设:第i-1层上至多有2^i-2个节点。由于二叉树的每个节点的度至多为2,故在第i层上的最大节点数为第i-2层上的最大节点数的2倍,即2*2^i-2=2^i-1。
性质2 深度为K的二叉树至多有2k-1个节点(k>=1)。
性质3 对任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1。
证明:
1. 设n1为二叉树T中度为1的节点数,则二叉树T总节点数为:n = n0 + n1 + n2。
2. 设二叉树T中所有分支个数为B,则n = B + 1。由于度为1的节点是有一个分支,度为的2的节点是有2个分支,所以有:B = n1 + 2n2。于是可得出:
n = n1 + 2n2 + 1。
3. 由:n = n0 + n1 + n2和n = n1 + 2n2 + 1得:n0 = n2 + 1。
满二叉树
一棵深度为k且有2k - 1个节点的二叉树称为满二叉树。
完全二叉树
满二叉树共有n个节点,按照有顺序的二叉树从根节点开始编号为1到n进行编号,假如有一棵二叉树节点总数为N(N>=1 && N <= n)的按顺序从1开始编号到N,且1到N这个顺序号在1到n中是依次对应的,那么这棵树就是完全二叉树。如下图。
性质4 具有n个节点的完全二叉树的深度为:|log2^n| + 1。
证明:
假设深度为k,则根据性质2和完全二叉树的性质有:
2^(k-1) - 1 < n <= 2^(k) - 1 或 2^(k - 1) <= n < 2^k。
于是k - 1 <= log2^n < k,因为k是整数,所以 k = |log2^n| + 1。
性质5 如果对一棵有n个结点的完全二叉树(其深度为|log2^n| + 1)的结点按层次编号(从第1层到|log2^n| + 1层,每层从左到右),则对任意结点 i(1 <= i <= n),有
(1)如果 i = 1, 则结点i是二叉树的根,无双亲;如果 i > 1,则其双亲PARENT(i)是结点 | i / 2 |。
(2)如果 2i >= n,则结点i 无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i。
(3)如果 2i + 1 > n,则结点 i 无右孩子;否则其右孩子RCHILD(i)是结点 2i + 1。
二叉树的存储结构
1.顺序存储结构,就是存储在一组数组中。
2.链式存储结构,分为:二叉链表和三叉链表。三叉链表中的结点至少包含3个域:数据域和左、右指针域。
二叉链表的结点结构包含:数据域和左、右指针域。
三叉链表的结点结构包含:数据域、双亲节点指针域和左、右指针域。如下图。
二叉树(Binary Tree)是另一种树型结构,它的特点是每个节点至多只有两颗子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次数不能任意颠倒。如下图。
二叉树的性质
性质1 在二叉树的第i层上至多有2i-1个节点(i>=1)。
证明(归纳法):
1. i = 1时,显然节点数等于1。
2. 假定所有的j,1<=j<i,命题成立,即第j层上至多有2^j-1个节点。那么,可以证明j = i时命题也是成立。
3.有归纳法假设:第i-1层上至多有2^i-2个节点。由于二叉树的每个节点的度至多为2,故在第i层上的最大节点数为第i-2层上的最大节点数的2倍,即2*2^i-2=2^i-1。
性质2 深度为K的二叉树至多有2k-1个节点(k>=1)。
性质3 对任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0 = n2 + 1。
证明:
1. 设n1为二叉树T中度为1的节点数,则二叉树T总节点数为:n = n0 + n1 + n2。
2. 设二叉树T中所有分支个数为B,则n = B + 1。由于度为1的节点是有一个分支,度为的2的节点是有2个分支,所以有:B = n1 + 2n2。于是可得出:
n = n1 + 2n2 + 1。
3. 由:n = n0 + n1 + n2和n = n1 + 2n2 + 1得:n0 = n2 + 1。
满二叉树
一棵深度为k且有2k - 1个节点的二叉树称为满二叉树。
完全二叉树
满二叉树共有n个节点,按照有顺序的二叉树从根节点开始编号为1到n进行编号,假如有一棵二叉树节点总数为N(N>=1 && N <= n)的按顺序从1开始编号到N,且1到N这个顺序号在1到n中是依次对应的,那么这棵树就是完全二叉树。如下图。
性质4 具有n个节点的完全二叉树的深度为:|log2^n| + 1。
证明:
假设深度为k,则根据性质2和完全二叉树的性质有:
2^(k-1) - 1 < n <= 2^(k) - 1 或 2^(k - 1) <= n < 2^k。
于是k - 1 <= log2^n < k,因为k是整数,所以 k = |log2^n| + 1。
性质5 如果对一棵有n个结点的完全二叉树(其深度为|log2^n| + 1)的结点按层次编号(从第1层到|log2^n| + 1层,每层从左到右),则对任意结点 i(1 <= i <= n),有
(1)如果 i = 1, 则结点i是二叉树的根,无双亲;如果 i > 1,则其双亲PARENT(i)是结点 | i / 2 |。
(2)如果 2i >= n,则结点i 无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i。
(3)如果 2i + 1 > n,则结点 i 无右孩子;否则其右孩子RCHILD(i)是结点 2i + 1。
二叉树的存储结构
1.顺序存储结构,就是存储在一组数组中。
2.链式存储结构,分为:二叉链表和三叉链表。三叉链表中的结点至少包含3个域:数据域和左、右指针域。
二叉链表的结点结构包含:数据域和左、右指针域。
三叉链表的结点结构包含:数据域、双亲节点指针域和左、右指针域。如下图。
相关文章推荐
- Java源码集合类TreeMap学习1——数据结构5红黑树
- Java源码集合类TreeMap学习1——数据结构3二叉树创建代码
- Java源码集合类TreeMap学习1——数据结构4平衡二叉树创建代码
- Java源码集合类TreeMap学习1——数据结构4平衡二叉树插入一个元素的递归算法
- Java源码集合类TreeMap学习1——数据结构1
- Java源码集合类TreeMap学习2
- Java源码集合类TreeMap学习1——数据结构4平衡二叉树的旋转
- Java集合源码学习(22)_NavigableMap接口的实现TreeMap
- Java源码集合类HashMap学习2
- JDK源码学习之TreeMap.java分析
- java1.8 常用集合源码学习:TreeMap
- java主要集合类的数据结构学习
- Java源码集合类LinkedHashMap学习1
- java主要集合类的数据结构学习
- java主要集合类的数据结构学习
- Java源码集合类HashMap学习1
- Java源码集合类Hashtable学习
- JDK源码学习(4)-java.util.HashMap、LinkedHashMap与TreeMap
- Java数据结构: java.util.BitSet源码学习
- java主要集合类的数据结构学习