Leetcode 144. 二叉树的前序遍历

题目

给定一个二叉树,返回它的 前序 遍历。

Leetcode 144. 二叉树的前序遍历_第1张图片
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.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; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preorderTraversal(root, res);
        return res;
    }
    
    public void preorderTraversal(TreeNode node, List<Integer> res) {
        if(node == null) return;
    
        res.add(node.val);
        preorderTraversal(node.left, res);
        preorderTraversal(node.right, res);
    }
}

结果

Leetcode 144. 二叉树的前序遍历_第2张图片

解法二:栈 + 非递归

使用栈保存遍历的结点路径。

但要注意一点的就是:先压右节点,再压左节点。(因为栈的反序问题)

这样就能保证会先遍历到结点的左节点了。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList<>();
        
        List<Integer> res = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
            res.add(node.val);
            
            if(node.right != null) {
                stack.push(node.right);
            }
            
            if(node.left != null) {
                stack.push(node.left);
            }
        }
        
        return res;
    }
}

结果

Leetcode 144. 二叉树的前序遍历_第3张图片

你可能感兴趣的:(leetcode)