算法 非递归先序遍历二叉树总结(3种方法)
@author:Jingdai
@date:2020.12.03
传送门
递归先序遍历二叉树非常的简单,但是面试的时候面试官经常会要求我们写非递归的方法,这里总结一下。
方法1
先写一个最简单的方法。首先回想一下层次遍历二叉树的代码,利用一个队列完成树的遍历。如下代码。
public static void levelOrderTraverse(TreeNode root) {
if (root == null)
return;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (queue.size() != 0) {
TreeNode cur = queue.poll();
System.out.println(cur.val);
if (cur.left != null)
queue.offer(cur.left);
if (cur.right != null)
queue.offer(cur.right);
}
}
如果将上述代码中的队列换成栈会怎样?还是会完成树的遍历,只是遍历的顺序有点奇怪,会变成对于一个节点,先遍历本身,然后遍历其右子树,再遍历其左子树。那先序遍历的顺序是什么呢?先遍历本身,然后遍历其左子树,再遍历其右子树,所以我们可以将左右子树入栈顺序变一下,结果就变成了如下代码。本质上将队列变成栈就是从 bfs 变成了 dfs 。
public static void preOrderTraverse(TreeNode root) {
if (root == null)
return;
LinkedList<TreeNode> stack = new LinkedList