您的位置:首页 > 其它

[LeetCode]Binary Tree Preorder Traversal

2014-02-25 12:26 260 查看

题目描述

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).重复执行(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;
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: