目录
栈的定义 语法注意:
Deque<Integer> stack = new ArrayDeque<>(); //比LinkedList更快
Deque<TreeNode> stack = new LinkedList<TreeNode>();
为什么不用stack 参考 liuyubobobo 老师编写的 Java 程序员,别用 Stack?!
前序遍历
根左右 前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。
递归版本
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
preorder(root);
return res;
}
//递归版本前序遍历
void preorder(TreeNode root){
if(root==null) return;
res.add(root.val);
preorder(root.left);
preorder(root.right);
}
}
- 时间复杂度:O(n),其中n是二叉树的结点数,每一个节点恰好被遍历了一遍。
- 空间复杂度:O(n),为递归过程中栈的开销,平均情况是O(logn),最坏情况下树呈现链状,为O(n)。
迭代版本
可以用迭代的方式实现方法一的递归函数,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其余的实现与细节都相同。
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new ArrayDeque<>();