解题心得: good job!真棒,前序遍历用递归的方法,是我自己做出来的!
二叉树使用栈stack来实现,跟之前一道题,就是获取链表最大的前k个值,有异曲同工之妙,都是,减少内存占用,先往栈转入有限的数据大小。
解题思路:
方法一:使用栈
stack.add(root). / while(!stack.isempty()) { top = stack.pop(); vist(top); stack.push(top.left); stack.push(top.right); }
方法二:递归
void func(TreeNode root) { if(root==null) return; vist(root); //visit放的位置不一样,就是不一样的遍历顺序了 func(root.left); func(root.right); }
import java.util.*; public class Solution { /** * 使用栈实现 */ public int[] preorderTraversal (TreeNode root) { if(root == null) { return new int[]{}; } List<Integer> res = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); stack.push(root); while(!stack.isEmpty()) { TreeNode top = stack.pop(); res.add(top.val); // 这里是先存入右节点,再存左节点 // 这样左节点,就可以先出了 if(top.right!=null) { stack.push(top.right); } if(top.left!=null) { stack.push(top.left); } } int [] arr = new int[res.size()]; for(int i=0; i<arr.length; i++) { arr[i] = res.get(i); } return arr; } /** * 使用递归的实现- 我自己做的 * @param root TreeNode类 * @return int整型一维数组 */ public int[] preorderTraversal2 (TreeNode root) { // write code here ArrayList<Integer> res = new ArrayList<Integer>(); preorderTreeNode(root, res); int[] arr = new int[res.size()]; for(int i=0; i<res.size(); i++) { arr[i] = res.get(i); } return arr; } public void preorderTreeNode(TreeNode root, ArrayList<Integer> res) { if(root == null) { return ; } res.add(root.val); preorderTreeNode(root.left, res); preorderTreeNode(root.right, res); } }