二叉树
1. 定义:是每个节点最多有两个子树的树结构,通常字树又被称为左子树和右子数,且次序不能颠倒。
节点的个数:二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n,度为2的结点数为m,则n=m+1。
2. 基本概念:
2.1 五种基本形态:空二叉树、只有根节点的二叉树、只有根节点和左子树的二叉树、只有根节点和右子树的二叉树、同时有根节点和左子树和右子树的二叉树。
注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形
树和二叉树的区别:
1.树对节点的度不做限制,二叉树限制度节点的度最大为2。
2.树的子树无左右之分,二叉树有左右之分。
2.2 类型:
- 完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子节点,并且叶子结点都是从左到右依次排布。
-
满二叉树:除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
2.3 相关术语:
- 树的节点:包含一个数据元素及若干指向子树的分支
- 孩子节点:结点的子树的根称为该结点的孩子
- 双亲节点:B 结点是A 结点的孩子,则A结点是B 结点的双亲
- 树的深度:树中最大的结点层
- 节点的度:结点子树的个数
- 叶子节点:也叫终端结点,是度为 0 的结点
- 度不为0的点:度不为0的结点
- 有序树:子树有序的树
- 无序树:不考虑字数的顺序
3. 二叉树的遍历:
3.1 先序遍历:先访问根,再访问左子树,最后访问右子数。
3.2 中序遍历:先访问左子树,再访问根,最后访问右子树。
3.3 后序遍历:先访问左子树,再访问右子树,最后访问根。
以下面二叉树(图片来自网上)来演示三种遍历的结果:
先序遍历(根左右):ABCDEFGHK
中序遍历(左根右):BDCAEHGKF
后序遍历(左右根):DCBHKGFEA
最小堆
定义:是一颗完全二叉树,非子叶节点的值不大于左孩子和右孩子的值。
图片示例最小堆原图传送门
最小堆元素插入:先将元素加入到该二叉树的最后一个节点,然后依据最小堆的定义,由下而上递归调整
最小堆元素删除:将二叉树的最后一个节点替换到根节点,然后自上而下递归调整。具体实现演示过程见插入删除传送门
二叉排序树:
性质:
- 若左子数不为空,则左子树的值均小于或等于根节点的值。
- 若右子树不为空,则右子树的值均大于或等于根节点的值。
- 左右子树也分别是二叉排序树。