二叉树的遍历虽然概念简单,但是每次写代码时候都记不清楚,尤其是迭代法,参考了高热度回答的思路,自己做个小整理吧。
递归
给出官方题解的思路,定义一个preorder(root)方法来实现递归。代码如下:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> tree = new ArrayList<Integer>();
preorder(root,tree);
return tree;
}
public void preorder(TreeNode root, List<Integer> tree) {
if (root == null) {
return;
}
tree.add(root.val);
preorder(root.left, tree);
preorder(root.right, tree);
}
}
迭代
官方题解的图片演示其实很清晰,但是前序遍历这里迭代的代码写的有点绕,借鉴了中序遍历的迭代代码,整合的很清晰~
利用了Deque双端队列这个数据结构,我一直理解的Deque是先进先出,stack是先进后出。但是验证改成stack后没有报错,给我的三观产生了巨大冲击,下篇博客,我将好好梳理下中间的原理到底是什么。
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
Deque<TreeNode> que = new LinkedList<TreeNode>();
//这里的deque和stack实现的pop方式最后是否相同
// Deque<TreeNode> que = new LinkedList<TreeNode>();
// Deque和Stack之间的pop实现的形式?
Stack<TreeNode> que = new Stack<>();
while (root != null || !que.isEmpty()) {
//节点不为空一直压栈
while (root != null) {
res.add(root.val);
que.push(root);
root = root.left;
}
//节点为空,就出栈
root = que.pop();
root = root.right;
}
return res;
}
}