|
1 | | -# 二叉树 |
| 1 | +# 二叉树和递归 |
2 | 2 |
|
3 | 3 | ## 知识点
|
4 | 4 |
|
5 | 5 | ### 二叉树遍历
|
6 | 6 |
|
7 | 7 | **前序遍历**:**先访问根节点**,再前序遍历左子树,再前序遍历右子树 **中序遍历**:先中序遍历左子树,**再访问根节点**,再中序遍历右子树 **后序遍历**:先后序遍历左子树,再后序遍历右子树,**再访问根节点**
|
8 | 8 |
|
9 | | -注意点 |
| 9 | +注意点和关键点 |
10 | 10 |
|
11 | | -* 以根访问顺序决定是什么遍历 |
12 | | -* 左子树都是优先右子树 |
| 11 | +* 遍历有dfs 和 bfs,dfs有递归和非递归,非递归可使用双色法+栈,bfs使用queue。 |
| 12 | +* dfs以根的访问顺序决定什么遍历,具体使用哪种要分析递归问题。  |
| 13 | +* 在分析递归问题时,需要考虑问题,包括需要从parent传入什么信息,需要从孩子收集什么信息。当需要parent信息,需要前序,需要孩子信息,则为后序,递归的退出条件也就是base情况,另外需要返回什么信息。 |
| 14 | +* 后序遍历的应用和分治的用法是相似,例如merge sort。前序遍历的应用quick sort。 |
| 15 | +* 更困难的题目有的时候需要混合前序和后序。 |
| 16 | +* 中序遍历对于BST是很重要的性质,因此在BST下,要理解中序遍历对于BST就是一个有序的遍历。 |
13 | 17 |
|
14 | 18 | #### 前序递归
|
15 | 19 |
|
@@ -479,7 +483,7 @@ void dfs(TreeNode* root, int level, int& ret)
|
479 | 483 |
|
480 | 484 | > 给定一个二叉树,判断它是否是高度平衡的二叉树。
|
481 | 485 |
|
482 | | -思路:分治法,后序遍历,左边平衡 && 右边平衡 && 左右两边高度 <= 1, 因为需要返回是否平衡及高度。如果某种情况是不平衡,可直接返回false。考虑三种情况,左边不平衡,右边不平衡,或者左右高度差大于1,都直接返回false,当返回true时,同时计算root的高度。本题目需要从孩子节点传入两个信息,1个为孩子是否平衡,同时还需要传入孩子节点高度。当分析递归问题时,需要考虑问题如下,需要从parent传入什么信息,需要从孩子收集什么信息。当需要parent信息,需要前序,需要孩子信息,则为后序。 |
| 486 | +思路:分治法,后序遍历,左边平衡 && 右边平衡 && 左右两边高度 <= 1, 因为需要返回是否平衡及高度。如果某种情况是不平衡,可直接返回false。考虑三种情况,左边不平衡,右边不平衡,或者左右高度差大于1,都直接返回false,当返回true时,同时计算root的高度。本题目需要从孩子节点传入两个信息,1个为孩子是否平衡,同时还需要传入孩子节点高度。 |
483 | 487 |
|
484 | 488 | ```cpp
|
485 | 489 | bool isBalanced(root *TreeNode) {
|
|
0 commit comments