迭代思想
迭代是对递归的高度模仿,我们都知道递归是基于栈来实现的,那么我们也可以自己new一个栈,写出我们的迭代算法。
前序迭代遍历
前序迭代是比较简单的思想
代码如下
public static void diedai1(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()) {
root = stack.pop();
list.add(root.val);
if (root.right != null) {
stack.add(root.right);
}
if (root.left != null) {
stack.add(root.left);
}
}
System.out.println(list);
}
注意的点是根据栈先进后出的特点,先进right,后进left
但是后序迭代算法在三种顺序中是最复杂的算法,需要用到while嵌套,有简单的算法我们为何不用呢?
那么我们可以通过前序解法得到后序解法
我们都知道前序是根左右,而后序是左右根,从前序解法中,我们不难看出根左右可以变成根右左,只要将两行入栈的代码交换位置即可,那么我们的关键就在于怎么将根右左变成左右根,我们可以通过
list.add(0,e)
得到我们的后序遍历
代码如下
public static void diedai2(TreeNode root) {
ArrayList<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()) {
root = stack.pop();
list.add(0,root.val);
// 后序即为 根右左的倒序
if (root.left != null) {
stack.add(root.left);
}
if (root.right != null) {
stack.add(root.right);
}
}
System.out.println(list);
}