144_二叉树的前序遍历

144_二叉树的前序遍历

 

package 二叉树.BT;
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
 * https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
 * @author Huangyujun
 *
 */
public class _144_二叉树的前序遍历 {
    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;
        }
    }
    // 递归实现
    ArrayList<Integer> nums = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root == null)    return nums;
        //拿到当前结点
        nums.add(root.val);
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return nums; 
    }

//    // 迭代实现
    //为啥选择的数据结构是:栈?(前序:先不断的进不断的进去,(后进先出))
//    ArrayList<Integer> nums = new ArrayList<>();
//    public List<Integer> preorderTraversal(TreeNode root) {
//        if (root == null)
//            return nums;
//        Stack<TreeNode> stack = new Stack<>();
//        while(root != null) {
//            nums.add(root.val);    //拿到当前结点(根)
//            while(root.left != null) {
//                stack.push(root);
//                //遍历左子树
//                root = root.left;
//                nums.add(root.val);
//            }
//            stack.pop();
//            //遍历右子树
//            while(!stack.isEmpty()) {
//                //右子树的左子树
//                while(root.left != null) {
//                    stack.push(root);
//                    //遍历左子树
//                    root = root.left;
//                    nums.add(root.val);
//                }
//                stack.pop();
//                //轮到右结点了
//                while(!stack.isEmpty()) {
//                    nums.add(stack.pop().right.val);
//                }
//            }
//            
//        }
//        return nums;
//    }
    /**
     * 我放的错误就是:没深刻体会到:(遍历左结点的同时正一层一层的往下跑)
        while(root.left != null) {
                stack.push(root);
                //遍历左子树
                root = root.left;
                nums.add(root.val);
            }
     * @param root
     * @return
     */
    //正解:
    public List<Integer> preorderTraversal1(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        //遍历过的点,不要了可以pop()掉,不断的pop(),然后才能拿到当前结点的右结点(先是不断的更新结点为左结点)
        //然后没有左结点了,开始pop() 一层(一个结点)
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        while (!stack.isEmpty() || node != null) {
            while (node != null) {
                res.add(node.val);
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            node = node.right;
        }
        return res;
    }
}

 

posted @ 2021-12-19 23:59  一乐乐  阅读(10)  评论(0编辑  收藏  举报