二叉树迭代遍历是用栈来代替递归,其中向下查询左节点进行入栈是统一的操作,我们需要思考合适进行结果写入以及出栈的操作,一个统一的模板可以帮助理清思路,详细注释都在代码里:
/**
* 迭代法遍历模板
* 需要想好:
* 1、何时写入结果
* 2、何时进行出栈
* 注意点:出栈之后curNode要置空,防止重复入栈
*/
private List<Integer> iterateTemplate(TreeNode root) {
Deque<TreeNode> stack = new ArrayDeque<>();
List<Integer> resultList = new ArrayList<>();
TreeNode curNode = root; // 当前节点
while (!stack.isEmpty() || curNode != null) {
if (curNode != null) {
// 左节点入栈过程
} else {
// 从栈中取
}
}
return resultList;
}
/**
* 前序遍历迭代
* 【1】将路径上的节点入栈,并写入结果,直到node.left为空
* 【2】弹出栈顶节点,并继续右节点【1】操作
*/
private List<Integer> preOrderIterate(TreeNode root) {
Deque<TreeNode> stack = new ArrayDeque<