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?

原问题链接: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;
    }
}

猜你喜欢

转载自shmilyaw-hotmail-com.iteye.com/blog/2309938