使用栈模拟递归调用
先序遍历代码
private static ArrayList search(TreeNode node) {
if (node == null) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
ArrayList<Integer> list = new ArrayList<>();
stack.push(node);
//从根节点开始将所有的左子树入栈
while (!stack.empty()) {
TreeNode pop = stack.pop();
if (pop == null) {
break;
}
list.add(pop.val);
// System.out.println(pop.val);
stack.push(pop.right);
stack.push(pop.left);
}
return list;
}
先序遍历的顺序是: 中 → 左 → 右
栈是先进后出的结构,所以在入栈的时候,需要右边的节点先入栈,这样出来的时候才是先出来
后序遍历顺序是 : 左 → 右 → 中
观察先序遍历:将子节点的入栈顺序做更改变成 中 → 右 → 左(子节点的顺序只是更改代码顺序就可实现)
然后将输出的链表做一个反转,就可以得到后序遍历的顺序
中序遍历:请参考其他博客