问题描述:
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
原问题链接:https://leetcode.com/problems/binary-tree-preorder-traversal/
问题分析
在之前的文章中我有讨论过二叉树的各种遍历方法。对于二叉树的前序遍历序列,我们可以从递归和非递归的两种方式来讨论。
递归解法
这种方法很简单,我们只需要记住递归调用的顺序是当前节点->左子节点->右子节点就可以了。为了记录所有访问的顺序,我们定义一个列表作为参数传进去。
详细的代码实现如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<>();
if(root == null) return result;
preorderTraversal(root, result);
return result;
}
private void preorderTraversal(TreeNode root, List<Integer> list) {
if(root == null) return;
list.add(root.val);
if(root.left != null) preorderTraversal(root.left, list);
if(root.right != null) preorderTraversal(root.right, list);
}
}
非递归解法
二叉树前序遍历的非递归解法有一个比较简单的实现,就是使用一个栈。先将根节点加入到栈中。每次从栈中间弹出顶端的元素。并先后将栈顶元素的右子节点和左子节点压入栈中。这么循环一直到栈为空。需要注意压入栈中的元素顺序。
详细的代码实现如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new LinkedList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
if(root != null) {
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
result.add(node.val);
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}
}
return result;
}
}