树
- 名词:
- 根
- 子树
- 结点
- 结点的度
- 叶子结点
- 孩子
- 双亲
- 兄弟
- 树的度
- 结点的层次
- 深度
- 有序树
- 无序树
- 森林
- 祖先
- 二叉树
- 满二叉树
- 完全二叉树
- 当且仅当每个结点都跟相同深度的满二叉树中编号1到n的结点一一对应,才是完全二叉树
- 二叉树的性质
- 第i层最多有 2i−1 方个结点
- 深度为k的二叉树,最多有 2k−1 个结点
- 对任何一个二叉树,n0,n1,n2表示度为0,1,2的结点数,则n0=n2+1(用边数去推);
- 具有n个结点的完全二叉树的深度为 logn2 +1
- 对一个n个结点的完全二叉树,则它的任意结点i(1<=i<=n)有:
- 如果i=1,i是根节点,无双亲;如果i>1,则双亲结点是i/2
- 如果2i>n,则结点i无左右孩子;否则左孩子为2i
- 如果2i+1>n,则结点i无右孩子;否则右孩子结点是2i+1
- (没保存。。。苍天啊!!!不想再打上去了,详细的给个链接,意思差不多)
二叉树的存储存储细节
- 顺序结构
- 链式结构
二叉树的遍历
- 先序遍历
- 中序遍历
- 后序遍历
线索二叉树
细节,注意参透,也是对前面遍历的一个加深理解。网上有不少代码,有的是有些细节错误的,还有些是阴差阳错,默认的设置使得他们忽视的细节没有出现问题。- 几个重要的树
- 表达式树
- 二叉排序树(
OlogN
)
- 查找算法很简单,递归
- 插入算法差不多,也是递归
- 删除算法比较复杂,需要考虑两个情况
- 被删除的结点具有两个子结点(找到被删除结点右子树中最小的结点来替代)
- 被删除的结点具有一个或者没有子结点(子结点直接替代或者直接删除被删结点即可)
平衡二叉树
- 左右子树都是平衡二叉树
- 左右子树的深度差不大于1
平衡二叉树的旋转旋转的讲解
- 难点,左旋转或者右旋转(删除插入大都需要旋转,假如可能的话,尽量不要删除平衡二叉树中的结点)
- AVL树百度的写的蛮全的
- 红黑树记得看评论,大家都值得学习
- 堆记得看评论