LeetCode—144—Binary Tree Preorder Traversal

题目

Given a binary tree, return the preorder traversal of its nodes' values.

Example:

Input: [1,null,2,3]
1

2
/
3

Output: [1,2,3]
Follow up: Recursive solution is trivial, could you do it iteratively?

翻译

给出一棵二叉树,返回其节点值的前序遍历。

解题思路

首先我们先来看下二叉树的三种遍历方式:前序,中序,后序。用一个例子来说明


LeetCode—144—Binary Tree Preorder Traversal_第1张图片

比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。

本题要求的前序遍历的方式。我们在这里采用递归的方式。主要是复习一下递归方法的具体执行过程。

先给出具体的实现过程

import java.util.ArrayList;
import java.util.List;

// 144. Binary Tree Preorder Traversal
// https://leetcode.com/problems/binary-tree-preorder-traversal/description/
// 二叉树的前序遍历
// 时间复杂度: O(n), n为树的节点个数
// 空间复杂度: O(h), h为树的高度
public class Solution {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    public List preorderTraversal(TreeNode root) {

        ArrayList res = new ArrayList();
        preorderTraversal(root, res);
        return res;
    }

    private void preorderTraversal(TreeNode node, List list){
        if(node != null){
            list.add(node.val);
            preorderTraversal(node.left, list);
            preorderTraversal(node.right, list);
        }
    }
}

接下来我们重点看下递归调用的过程


LeetCode—144—Binary Tree Preorder Traversal_第2张图片

上图就是递归调用的实现。此时执行到 preorderTraversal(node.left, list)这一行,在这里调用了一个方法——preorderTraversal(TreeNode node, List list)。而这个方法比较特殊。因为是他自己。就是自己调用自己。那么程序执行到这时,就会停止继续向下一行执行。而是进入到preorderTraversal(TreeNode node, List list)方法内部执行。

那么具体是如何实现这个停下的过程呢?在这里就有一个栈专门负责,如上图所示。这个栈记录了当前方法需要做哪些事。以及已经做了哪些。图中蓝色代表已经做过的,红色代表未做的。

此时也就是执行到了访问1的左节点2。如下图,


LeetCode—144—Binary Tree Preorder Traversal_第3张图片

此时进入了访问1左节点2这个方法。然后又执行到了调用自身方法这一行。同样又将当前执行信息放入栈中。这里省略了具体执行过程。而此时,2节点没有子节点了。所以方法直接返回了。

那么返回之后,如何知道上一层执行到了哪里?方法就是拿出此时栈顶的元素,就可知道将要执行的命令——访问2的右节点。同样是个递归调用,将当前执行状态压入栈中,如下图。因为2没有右节点,所以直接返回了。同样取出栈顶元素,此时发现访问2的左节点右节点都已经执行了。然后继续向上一层返回。

LeetCode—144—Binary Tree Preorder Traversal_第4张图片

继续向上一层返回之后,同样取出栈顶元素,发现将要执行的是访问1的右节点。过程和访问左节点一样。

LeetCode—144—Binary Tree Preorder Traversal_第5张图片

关注我免费下载CSDN

关注公众号哦

你可能感兴趣的:(LeetCode—144—Binary Tree Preorder Traversal)