目录
二叉树
站在巨人的肩膀上我做了一些个人理解和总结
本文的图片以及内容来自原文:二叉树理论基础篇
1. 分类
1. 满二叉树(满节点的二叉树)
-
如果深度为k,有2^k-1个节点的二叉树 (等比数列求和公式)
-
深度为k,对应的那层的节点数为2^(k-1)
2. 完全二叉树(从上到下,从左到右,是连续的就行)
- 除了最底层节点可能没填满外,其余每层节点数都达到最大值
- 最下面一层的节点都集中在该层最左边的若干位置(为了算法而设定的吧,这样的话节点就是连续的了,中间没有空挡)
3. 二叉搜索树
二叉搜索树是有数值的树,是一个有序的树
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
- 它的左、右子树也分别为二叉排序树
4. 平衡二叉搜索树(AVL)
在二叉搜索树的基础上,多了个条件:左右子树的高度差不能超过1
2. 存储方式
1. 链式存储(链表实现,每个节点都有2个指针)(算法中用这个比较多)
链式存储则是通过指针把分布在散落在各个地址的节点串联一起,内存不连续
1. 代码如何使用链式存储定义一个二叉树
public class Tree {
int val; // 值
Tree left; // 左子树
Tree right; // 右子树
// 构造函数
public Tree() {
}
public Tree(int val, Tree left, Tree right) {
this.val = val;
this.left = left;
this.right = right;
}
}
2. 顺序存储(数组实现,因为数组连续,所以实现一定是完全二叉树)
顺序存储的元素在内存是连续分布的
1. 公式(记不住的,看图就行)
如果父节点的数组下标是 i,那么
- 它的左孩子就是 i * 2 + 1
- 它的右孩子就是 i * 2 + 2
3. 二叉树的遍历方式
我们把好好的数据变成二叉树的形式,肯定有其中的道理,奥秘所在
根据遍历的侧重点不一样,分为:
1. 深度优先遍历
先往深走,遇到叶子节点再往回走
下面的前中后,其实指的就是中间节点的遍历顺序,只要大家记住 前中后序指的就是中间节点的位置就可以了。
1. 分类
- 前序遍历(递归法,迭代法)
中左右 - 中序遍历(递归法,迭代法)
左中右 - 后序遍历(递归法,迭代法)
左右中
2. 如何实现(用栈的递归特性)
可以借助栈使用非递归的方式来实现的
2. 广度优先遍历
一层一层的去遍历
1. 层次遍历(迭代法)
2. 如何实现(用队列的先进先出特性)
一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。