算法通关村第七关—理解二叉树的遍历(白银)

       深入理解前中后序遍历

给定一棵二叉树

算法通关村第七关—理解二叉树的遍历(白银)_第1张图片
二叉树前序遍历

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);
    }
}

你可能感兴趣的:(算法通关村,算法,leetcode,java,数据结构,开发语言)