先序遍历
给定一个二叉树的根节点 root ,返回它的 先序 遍历。
先序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树
示例
![[二叉树] 系列:非递归先序遍历 - 图1](/uploads/projects/xinmengwuhen-ga5rv@rbpxet/cd9e7e76cbe5c0a93b9718762bb03e90.jpeg)
方法一:递归
class Solution {List<Integer> res = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {if(root == null) return res;res.add(root.val);preorderTraversal(root.left);preorderTraversal(root.right);return res;}}
方法二:迭代
1.初始化返回列表,判空,初始化栈,初始化cur节点
2.循环:当前节点不空或者栈不空
- 从当前节点开始一直往左相继添加到res,同时入栈
- 出栈,当前节点指向右孩子
3.返回res
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null) return res;LinkedList<TreeNode> stack = new LinkedList<>();TreeNode cur = root;while(cur != null || !stack.isEmpty()){while(cur != null){res.add(cur.val);stack.addFirst(cur);cur = cur.left;}cur = stack.removeFirst();cur = cur.right;}return res;}}
或者:
class Solution {List<Integer> res = new ArrayList<>();public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if(root == null) return res;LinkedList<TreeNode> stack = new LinkedList<>();TreeNode cur = root;stack.addFirst(cur);while(!stack.isEmpty()){cur = stack.removeFirst();res.add(cur.val);if(cur.right != null){ //右stack.addFirst(cur.right);}if(cur.left != null){ //左stack.addFirst(cur.left);}}return res;}}
方法三:Morris中序遍历
能将非递归的中序遍历空间复杂度降为 O(1)。
