开启二叉树专题,递归遍历二叉树模板(2021-7-20))
递归遍历二叉树模板
★2021-7-20打卡LeetCode的三个题,要开始刷二叉树的题了,二叉树很重要的一个思想就是递归,而对于二叉树来说,遍历是我们不可避免的一个问题,先把基础的遍历模板记住了,对于我们后续学习二叉树有很大的帮助。
”
二叉树的数据结构
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
递归前序遍历
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer>res=new ArrayList<>();
dfs(root,res);
return res;
}
public void dfs(TreeNode root,List<Integer> res){
//递归出口
if(root==null){
return;
}
//递归左孩子
dfs(root.left,res);
//中序添加值
res.add(root.val);
//递归右孩子
dfs(root.right,res);
}
}
递归前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
dfs(root,res);
return res;
}
public void dfs(TreeNode root, List<Integer> res){
//递归出口
if(root==null){
return;
}
//前序添加根节点值
res.add(root.val);
//递归处理左孩子
dfs(root.left,res);
//递归处理右孩子
dfs(root.right,res);
}
}
递归后续遍历
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
dfs(root,res);
return res;
}
public void dfs(TreeNode root,List<Integer> res){
//递归出口
if(root==null) return;
//递归处理左孩子
dfs(root.left,res);
//递归处理右孩子
dfs(root.right,res);
//添加父节点值
res.add(root.val);
}
}
总结
★我们发现这三种遍历代码很大程度都很相似,而且很简洁。
”
很相似是因为二叉树的3种遍历方式,访问节点的顺序不一致,但是访问的都是同样的节点导致的,比如我们前序遍历是不是直接访问父节点的值,然后再去访问左孩子,再最后访问右孩子,他们的不同访问顺序导致他们遍历模板相似但意义相差又有些许的差别。 为什么代码这么简洁,这也许是递归的魅力吧,你只要理解递归,永远不要跳入递归,因为你的脑子永远赶不上计算机的栈内存大。我们要思考的是它的上一个节点要干嘛,它的后续节点是否有相同的操作,如果有相同的操作,那么递归排上用场了,树的遍历就是如此,因为左右孩子节点和父节点有一样的操作,都要按照指定的顺序和规则去做重复的事情。