确定输入输出: input: TreeNode root output:前序遍历输出的ArrayList 常规递归模版:
public void helper() { if(递归终止条件) return; 处理当前层 进行递归操作 }结合前序遍历和输入输出的要求:
public void helper(List<Integer> res , TreeNode node) { if(终止条件) return; //前序遍历,先将当前根节点添加进res,再进入递归添加左子节点和右子节点 res.add(node.val); helper(res,node.left); helper(res,node.right); }接下来要解决的就是递归终止条件,实际上非常容易想到,当当前节点为空,递归结束
class Solution { //完整代码 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); helper(res,root); return res; } public void helper(List<Integer> res , TreeNode node) { if (node == null) { return; } res.add(node.val); helper(res , node.left); helper(res , node.right); } }以上就是前序遍历的递归解法,实际上中序遍历与后序遍历只需要在以上的代码中更改节点添加顺序即可(为了简洁我只给出修改的部分):
//中序遍历(左根右) helper(res , node.left); res.add(node.val); helper(res , node.right); //后序遍历(左右根) helper(res , node.left); helper(res , node.right); res.add(node.val);再根据本题的特点对模版进行填充,我们需要的变量有: input: 根节点(当前节点) output:二维List 记录层次的变量int level
public void helper(TreeNode node , int level , List<List<Integer>> res) { if (node == null) return;//二叉树遍历的常规终止条件 //处理当前层,我们利用res的size来与level进行比对,确定当前层的操作 //res的初始size为0,所以我们设置初始level也为0,当size与level相同时我们创建新的子项 if (res.size() == level) { res.add(new ArrayList<>()); } //当前层的操作就是将当前节点的值添加进对应层次的res子项中 res.get(level).add(node.val); //处理完当前层进入递归 helper(node.left , level + 1 , res); helper(node.right , level + 1 , res); }递归解法来解二叉树遍历的相关题目是非常简单的,并且相似性非常高,很容易掌握,下一篇的非递归解法才是重头戏。