🌲🌲🌲 前言
在二叉树相关的算法中,对于二叉树的搜索和遍历是绕不开的话题「绕开了当我没说😬」。如果你对二叉树的搜索、遍历还没有掌握的很清楚,那么咱就一起来康康。内容包括『二叉树的前序、中序、后序遍历的递归和迭代,以及深度优先搜索、广度优先搜索』 ,如果这几种都掌握了,也希望能看看有什么不对的地方,本算法菜鸟不胜感激。💐
二叉树遍历
二叉树的遍历包括但是不限于前序、中序、后序、层序、垂序等遍历方式,都是将二叉树所有的节点都访问一遍,然后按照不同的顺序输出节点的值。这里只说一下对前中后序以及层序遍历的想法,对别的方式有兴趣的可以自行搜索哦!🤡
📋 概念总结
- 前序遍历: 从二叉树的根节点出发,当第一次到达节点时就输出节点数据,按照先向左再向右的方向访问。
- 中序遍历: 从二叉树的根节点出发,当第二次到达节点时就输出节点数据,按照先向左再向右的方向访问。
- 后序遍历: 从二叉树的根节点出发,当第三次到达节点时就输出节点数据,按照先向左再向右的方向访问。
- 层次遍历: 从二叉树的根节点出发,按照树的层次自上而下的遍历二叉树。
Tipes: 不管哪种遍历方式,都是从二叉树的「根节点」开始的,不同的遍历方式是在不同的时间点输出节点的内容。
我自爆第一次学习遍历的时候这概念看好多遍硬是看不懂😂。
首先不管哪种遍历方式,每个节点都会被访问到。如果把遍历位置比做指针的话,那么指针在每个节点都有三次不同时机的驻留:
- 在遍历他的左子树之前;
- 在递归完他的左子树之后,递归他的右子树之前;
- 在递归他的右子树之后;
那么我们对比上面的概念,正好每一次驻留都对应我们所说的前序、中序、后序遍历。
- 前序遍历 --> 根在前,从左往右,一棵树的根永远在左子树前面,左子树在右子树前面「根、左、右」;
- 中序遍历 --> 根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面 「左、根、右」;
- 后序遍历 --> 根在后,从左往后,一个数的左子树永远在右子树前面,右子树在根前面 「左、右、根」;
🔖 递归模版
上面的概念看得干巴巴的,下面来写点代码润润,先从最简单的递归开始。🐋
🔵 前序遍历递归模版
前序遍历就是根节点在左子树前面,左子树在右子树前面,所以我们在遍历的时候要先把根节点保存,然后再保存左子树,最后保存右子树。
验证一下输出结果:「借用一下力扣的编辑器,哈啊哈😄」
总结一下模版:
//「根、左、右」
arr = []
recursive (root) {
if(!root) return;
arr.push(root.val); // 根节点在最前面
recursive(root.left); // 然后是左子树
recursive(root.right); // 最后是右子树
}
🔴 中序遍历递归模版
中序遍历就是左子树在根节点前面,根节点在右子树前面,所以先遍历所有的左子树再根节点,最后是右子树。
验证一下输出结果:
总结一下模版:
//「左、根、右」
arr = []
recursive (root) {
if(!root) return;
recursive(root.left); // 先遍历所有的左子树
arr.push(root.val); // 到尽头没有左子树,当前节点为根节点
recursive(root.right); // 最后遍历所有右子树「还是先找左节点」
}
🟡 后序遍历递归模版
后序遍历就是左子树在左子树前面,右子树在根节点前面,所以先遍历所有的左子树再遍历右子树,最后是根节点。
验证一下输出结果:
总结一下模版:
//「左、右、根」
arr = []
recurs