144. 二叉树的前序遍历 + 前序递归 + 非递归前序遍历

144. 二叉树的前序遍历

LeetCode_144

题目描述

方法一:递归法

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        dfs(root, list);
        return list;
    }
    void dfs(TreeNode root, List<Integer> list){
        if(root == null)
            return;
        list.add(root.val);
        dfs(root.left, list);
        dfs(root.right, list);
    }
}

方法二:非递归前序遍历

  1. 非递归的方法可以使用栈来模拟递归的思路。
  2. 前序递归的方法为:中 =》 左 =》 右,所以使用栈时可以先存储根节点的值,然后将右结点进栈,最后将左节点进栈。
  3. 值得一提的是:在后序遍历的情况下:可以使用栈先将左子树结点进栈,再将右子树进栈,最后reverse整个list就是答案。因为 中=》右=》左 逆转后就是后序遍历的顺序。
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        
        List<Integer> list = new ArrayList<>();
        if(root == null)
            return list;
        Stack<TreeNode> sta = new Stack<>();
        sta.push(root);
        while(!sta.isEmpty()){
            TreeNode now = sta.pop();
            list.add(now.val);
            if(now.right != null)
                sta.push(now.right);
            if(now.left != null)
                sta.push(now.left);
        }
        return list;
    }
}
posted @ 2021-03-16 21:19  Garrett_Wale  阅读(54)  评论(0编辑  收藏  举报