题目描述
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?(你能使用非递归方法解决吗?)
解题思路
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
递归算法简洁明了、可读性好,但与非递归算法相比要消耗更多的时间和存储空间。按照题目要求我们采用一种非递归的二叉树遍历算法。非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似。
对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中前序遍历算法的实现的过程如下:
(1).初始化栈,根结点进栈;
(2).若栈非空,弹出栈顶元素。将弹出的栈顶结点的右孩子(如果有的话)结点进栈;将弹出的栈顶结点的左孩子(如果有的话)结点进栈;。
(3).重复执行(2),直至栈为空。
对于中序遍历来说,非递归的算法比递归算法的效率要高的多。其中前序遍历算法的实现的过程如下:
(1).初始化栈,根结点进栈;
(2).若栈非空,弹出栈顶元素。将弹出的栈顶结点的右孩子(如果有的话)结点进栈;将弹出的栈顶结点的左孩子(如果有的话)结点进栈;。
(3).重复执行(2),直至栈为空。
代码
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> res = new ArrayList<Integer>();
if(root == null)
return res;
Stack<TreeNode> st = new Stack<TreeNode>();
st.push(root);
while(!st.isEmpty()){
TreeNode cur = st.peek();
res.add(cur.val);
st.pop();
if(cur.right != null)
st.push(cur.right);
if(cur.left != null)
st.push(cur.left);
}
st = null;
return res;
}
}