[LeetCode] 94. 二叉树的中序遍历(java实现、非递归法)
1. 题目
2. 读题(需要重点注意的东西)
使用二叉树的中序遍历模板,可以使用递归很简单的解决这个问题。但是你能否使用非递归的方法实现二叉树的中序遍历呢?
主要思路:对每一个结点,一直往左走,遍历到的结点加入栈,当左孩子为空时,弹出栈内元素,加入该元素的右孩子,再重复上述操作。
试问,为什么二叉树的中序遍历(非递归方法)与二叉树的前序遍历、二叉树的后序遍历(非递归法)的思路不同呢?即为什么不能简单改动几行前、后序遍历的代码来实现呢?
3. 解法
解法:非递归法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
// 定义一个指针遍历二叉树
TreeNode cur = root;
if(cur == null) return list;
while(!stack.isEmpty() || cur != null){
// 对每一个结点,先把他所有的左子孩子加到栈中
while(cur != null){
stack.push(cur);
cur = cur.left;
}
// 如果没有左孩子,则pop栈中结点,加入其右孩子
TreeNode node = stack.pop();
list.add(node.val);
cur = node.right;
}
return list;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
前序遍历非迭代法:根入栈、根出栈、根出栈时右左孩子入栈,依次迭代;
中序遍历非迭代法:根入栈、根不能立刻出栈,只有当左孩子不存在时才能出栈,并同时右孩子入栈,依次迭代;
后序遍历非迭代法:根入栈、根出栈、根出栈时左右孩子入栈,依次迭太代,最后翻转输出的数组。
通过以上分析思路可以得出,只有中序遍历时,出栈是有条件的,并且入栈顺序也和前、后序遍历不同,它的入栈顺序是先让当前节点的所有左孩子入栈,因此,不能简单通过更改前后序遍历代码得到。