力扣简144 二叉树的前序遍历++

树 前序遍历 递归调用 迭代(没写) 栈

 

 

package leetcode01;

import java.util.LinkedList;
import java.util.List;

public class Solution144 {
    public static List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res=new LinkedList<Integer>();
        res=preorder(root, res);
        return res;
    }

    public static List<Integer> preorder(TreeNode root,List<Integer> res) {
        if(root!=null) {//这里最开始写的while,导致在递归第一个root.left不断的把left的val值add进去,应该是if。
            res.add(root.val);
            if(root.left!=null) {
                preorder(root.left,res);
            }
            if(root.right!=null) {
                preorder(root.right,res);
            }
        }
        return res;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeNode p=new TreeNode(12,new TreeNode(),new TreeNode(-60,null,null));
        System.out.print(preorderTraversal(p));
    }

}

 

题解:递归 栈

栈的定义 :Deque<TreeNode> stack=new LinkedList<TreeNode>();
add=addLast   push=addfirst 所以这里要用 每次新加的都在开头,才能后进先出
pop和poll没有觉得有啥差异 都是从first弹出
public static List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res=new LinkedList<Integer>();
        if(root==null) {
            return res;
        }
        Deque<TreeNode> stack=new LinkedList<TreeNode>();
        while(!stack.isEmpty()||root!=null) {
            while(root!=null) {    
            stack.push(root); //add=addLast   push=addfirst 所以这里要用 每次新加的都在开头,才能后进先出
            res.add(root.val);
            root=root.left;
        }
            root=stack.pop();//pop和poll没有觉得有啥差异 都是从first弹出
            root=root.right;
        }            
        return res;
    }

 

posted @ 2022-05-26 17:16  Ssshiny  阅读(23)  评论(0)    收藏  举报