深入理解前中后序遍历
给定一棵二叉树
二叉树前序遍历
public void preorder(TreeNode root,List<Integer>res){
if(root==null){
return;
}
res.add(root.val);
preorder(root.left,res);
preorder(root.right,res);
}
递归的过程如下图所示
从图中可以看到,当root的一个子树为null的时候还是会执行递归,进入之后发现root==null了,然后就开始返回。这里我们要特别注意res.add)的时机对不对,将其进入顺序依次写出来就是需要的结果。该过程明确之后再debug就容易很多,刚开始学习递归建议多画几次,熟悉之后就不必再画了。
前序遍历写出来之后,中序和后序遍历就不难理解了,中序是左中右,后序是左右中。代码如下:
中序遍历
public static void inorderRecur(TreeNode head){
if (head == null){
return;
}
inorderRecur(head.left);
System.out.print(head.value + " ")
inorderRecur(head.right);
}
后序遍历
public static void inorderRecur(TreeNode head){
if (head == null){
return;
}
inorderRecur(head.left);
inorderRecur(head.right);
System.out.print(head.value + " ")
}
另外需要注意一点,面试,以及LeetCode里提供的方法可能不能直接用来递归,需要我们再创建一个方法,例如:
LeetCode144二叉树前序遍历问题,此时给的函数oreorderTraversal()就难以直接递归,我们可以自己再创建一个:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList();
preorder(root, list);
return list;
}
public void preorder(TreeNode root, List<Integer> list){
if(root == null) return;
list.add(root.val);
preorder(root.left, list);
preorder(root.right, list);
}
}