数据结构之二叉树
- 一种非线性数据结构
- 树(森林)
- 四种表示方法
- 树形表示法
- 嵌套集合表示法
- 凹入表表示法
- 广义表表示法
- 四种表示方法
- 二叉树
- 五种基本形态
- 空二叉树
- 单结点的二叉树
- 右子树为空的二叉树
- 左子树为空的二叉树
- 左右子树均非空的二叉树
- 两种特殊的二叉树
- 满二叉树:一颗二叉树的深度为k,则其有2^k-1个节点。
- 完全二叉树:先把前面的节点填满才能填后面的。满二叉树是完全二叉树的特例。
- 遍历二叉树
- 五种基本形态
- 树形结构的存储方式:链式存储和顺序存储
- 线索二叉树
- 堆
- 堆的构造
- 堆的插入与删除
- 哈夫曼树:一类带权路径长度最短的树。
几种树的名称:多叉树、二叉树、二叉排序树、完全二叉树、完全二叉排序树、平衡二叉树、平衡二叉排序树(AVL树)
满二叉树是完全二叉树中的一种特殊情况;堆是完全二叉树中的一种特殊情况。完全二叉树是平衡二叉树中的一种。
二叉树的性质:
- 在二叉树第i层上至多有2^(i-1)个节点(i>=1)
- 深度为k的二叉树至多有2^k-1个节点
- 对任何一棵二叉树T,设n_0、n_2分别是叶节点的个数和度为2的节点的个数,则有n_0=n_2+1。
- 具有n个节点的完全二叉树的深度为「log2(n)」+1。(向下取整)
- 对于一棵有n个节点的完全二叉树,其任何一个编号为i的节点(1<=i<=n),都有以下结果:
- 关于父节点:
- 若i=1,则节点i是根节点,无父节点;
- 若i>i,则节点i的父节点是节点「i/2」。
- 对于左子节点:
- 若2i<n,则节点 i 的左子节点是2i;
- 若2i>n,则节点 i 无左子节点。
- 对于右子节点:
- 若2i+1<n,则节点 i 的右子节点是2i+1;
- 若2i+1>n,则节点 i 无右子节点。
- 关于父节点:
二叉树的存储方式:
- 顺序存储结构:适合完全二叉树;完全二叉树可用一维数组依次存储它的各节点。
- 链式存储结构:对于一般二叉树(非完全二叉树),比较适合使用一种二叉链表结构(非线性链表)来存储;在这种链表中,每个节点至少包含3个域:数据域和左、右指针域。
二叉树的遍历:
- 前序:即先根遍历(整棵树的根节点在最前面),遍历顺序为:根—左子树—右子树;按照这种顺序遍历,直至没有子节点为止。
- 中序:即中根遍历,遍历顺序为:左子树—根—右子树;
- 后序:即后根遍历(整棵树的根节点在最后面),遍历顺序为:左子树—右子树—根
在编程实现时,前三种遍历需要借助递归实现。
- 按层遍历:从根节点开始逐层向下遍历,直至最后一层。对于同一层的节点,由左向右遍历。
树的存储结构:
- 父节点表示法:除根节点外每个节点都有一个指向其父节点的指针,而不要求每个节点具有指向子节点的指针。这种表示法只需要用一维数组来存储树的有关信息。
- 子节点表示法
- 树的子节点-父节点表示法
- 子节点-兄弟表示法:又称为二叉链表表示法,以二叉链表的形式作为树的存储结构。
二叉排序树:见百度百科
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 左、右子树也分别为二叉排序树;
- 没有键值相等的节点。
几种特殊的二叉树:
- AVL树,即(严格)平衡二叉排序树,满足以下性质:
- 它的左子树和右子树的深度之差的绝对值不超过1
- 它的左、右子树都是平衡二叉排序树。
- 红黑树:一种非严格平衡二叉排序树。AVL树与红黑树的比较
- 堆:一种特殊的完全二叉树。堆总是满足下列性质:
-
堆中某个节点的值总是不大于或不小于其父节点的值;
- 堆总是一棵完全二叉树。
根节点(堆顶元素)最大的堆叫做最大(值)堆或最大根堆,根节点最小的堆叫做最小(值)堆或最小根堆。
B-树:多叉平衡查找树,适合在外存(如磁盘文件)进行数据存储和查找。