题目
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?
翻译
给出一棵二叉树,返回其节点值的前序遍历。
解题思路
首先我们先来看下二叉树的三种遍历方式:前序,中序,后序。用一个例子来说明
比如上图正常的一个满节点,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);
}
}
}
接下来我们重点看下递归调用的过程
上图就是递归调用的实现。此时执行到 preorderTraversal(node.left, list)这一行,在这里调用了一个方法——preorderTraversal(TreeNode node, List
那么具体是如何实现这个停下的过程呢?在这里就有一个栈专门负责,如上图所示。这个栈记录了当前方法需要做哪些事。以及已经做了哪些。图中蓝色代表已经做过的,红色代表未做的。
此时也就是执行到了访问1的左节点2。如下图,
此时进入了访问1左节点2这个方法。然后又执行到了调用自身方法这一行。同样又将当前执行信息放入栈中。这里省略了具体执行过程。而此时,2节点没有子节点了。所以方法直接返回了。
那么返回之后,如何知道上一层执行到了哪里?方法就是拿出此时栈顶的元素,就可知道将要执行的命令——访问2的右节点。同样是个递归调用,将当前执行状态压入栈中,如下图。因为2没有右节点,所以直接返回了。同样取出栈顶元素,此时发现访问2的左节点右节点都已经执行了。然后继续向上一层返回。
继续向上一层返回之后,同样取出栈顶元素,发现将要执行的是访问1的右节点。过程和访问左节点一样。
关注我免费下载CSDN
关注公众号哦