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; } }
本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709227.html