你所了解的二叉树结构?
- 节点的度:节点拥有子树的数目叫做节点的度,叶子节点的度为0
- 树的度:树内各结点的度的最大值。
<1>满二叉树(完美二叉树)
一个二叉树,每一层的结点树都达到最大值。也就是说,最后一层结点外,每一层上的任何结点都有两个子节点。
<2>完全二叉树
只有最下面两层节点的度小于2,并且最下面一层的结点都集中在该层的左边的若干位置。
性质:对树中的结点从上到下、从左至右编号,如果编号为i的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则该棵二叉树为完全二叉树。
满二叉树是完全二叉树的特殊形态,如果一棵树是满二叉树,那它必然是完全二叉树。
<3>堆
- 大顶堆:左右子树的结点值都比根结点小,左右子树也都是大顶堆。
- 小顶堆:左右子树的结点值都比根结点大,左右子树也都是小顶堆。
<4>二叉排序树(二叉查找树)
左子树上的值都小于根结点的值,右子树上的值都大于根结点的值,左右子树也都是二叉排序树。
Java之二叉排序树
<5>二叉平衡树(AVL树)
是一棵二叉排序树,且左右子树高度差不超过1,左右子树都为二叉平衡树。
左、右两棵树都是二叉排序树,但只有右边这棵是二叉平衡树。
- 平衡因子:某节点左子树和右子树高度差称为该节点的平衡因子。
当新节点没有插入的时候,该树是一棵平衡二叉树,但当新节点插入的时候,破坏了平衡二叉树的结构,沿着新插入的点往上找,找到第一个**|平衡因子|>=2的节点,以该节点为根节点的子树称为最小失衡子树**,平衡二叉树的失衡调整主要是针对调整最小失衡树来实现的。
1,左孩+左孩---->右旋
当新节点2插入的时候,以6为根节点的子树为最小失衡树,新节点2插在6节点的左子树的左子树上,现在对根节点右旋恢复平衡。
-
根节点的左孩子代替根节点的位置
-
根节点的左子树的右子树变为根节点的左子树
-
原来根节点及其新生成的子树 ,变为,原来根节点左子树的右子树,新的二叉平衡树生成。
2,右孩+右孩—>左旋
当新节点5插入的时候,以2为根节点的子树为最小失衡树,新节点6插在2节点的右子树的右子树上,现在对根节点左旋恢复平衡。 -
根节点的右子树代替根节点位置
-
根节点的右子树的左子树变为根节点的右子树
-
原来根节点及其新生成的子树 ,变为,原来根节点左子树的右子树,新的二叉平衡树生成。
3,左孩+右孩—>左孩左旋+根节点右旋
新节点5的插入造成原来的二叉树失衡,由于新节点是插在根节点的左孩子的右孩子上,需要进行两次旋转才能恢复平衡。
- 根节点左孩子左旋
- 根节点右旋
4,右孩+左孩—>右孩右旋+根节点左旋
新节点4的插入造成原来的二叉树失衡,由于新节点是插在根节点的右孩子的左孩子上,需要进行两次旋转才能恢复平衡。
- 根节点右孩子右旋
- 根节点左旋
<6>哈夫曼树