[LeetCode]Binary Tree Preorder Traversal

题目描述

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;  
    }  
}



你可能感兴趣的:([LeetCode]Binary Tree Preorder Traversal)