一、二叉树基础
1. 种类
-
满二叉树:只有度为0的结点和度为2的结点,并且度为0的结点在同一层上
-
完全二叉树:除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置
-
二叉搜索树:有序树
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树
-
平衡二叉搜索树: AVL(Adelson-Velsky and Landis)树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_map底层实现是哈希表。
2. 存储
- 链表,输入头节点
- 数组,从0开始,左孩子 = 2 i + 1 2i + 1 2i+1, 右孩子 = 2 i + 2 2i + 2 2i+2
3. 遍历
- 深度优先搜索,递归遍历,或者栈来模拟
- 前序遍历,中左右
- 中序遍历,左中右
- 后序遍历,左右中
- 广度优先搜索,用队列
- 层序遍历
4. 定义
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int t){
val = t;
left = nullptr;
right = nullptr;
}
}
二、递归遍历
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
-
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
- Leetcode 144.二叉树的前序遍历
- Leetcode 145.二叉树的后序遍历
- Leetcode 94.二叉树的中序遍历
三、非递归迭代遍历
注意压栈的顺序和递归顺序相反。伪代码写了,代码还没写。
四、统一迭代
头晕看不懂了,以后有时间看看。