二叉树的遍历如果用递归的话,是比较好做的。
这里,选择有挑战一点的解法:迭代直接求解。
首先,我们先造一个二叉树。
中序遍历需要先访问完左边的子树,才能访问中间的,最后访问右边子树。
我们自己先模拟中序遍历,4->3->9,9的左子树为空,此时可以输出9了,接着再访问9的右子树。
只有9的右子树访问结束,我们才会去访问前面的3,所以我们需要用一个栈的结构先把前面碰到的节点存储起来。
访问9的右子树的时候,我们可以想象成它就是一个独立的树,所以,6->4,4的左子树为空,可以输出4了。
总结一下:
我们的算法分为3步走:
1. 从当前节点开始,走到最左的节点,中途存储遍历到的节点。
2. 如果这个最左的节点的右子树非空,那么右子树成为当前节点,重复1步骤。
3. 如果这个最左的节点的右子树是空的,那么从栈中弹出更前面的节点。
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> store = new Stack<>();
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
store.push(root);
while (root.left != null) {
store.push(root.left);
root = root.left;
}
while (!store.empty()) {
TreeNode cur = store.pop();
list.add(cur.val);
if (cur.right != null) {
root = cur.right;// let cur.right be the current node
store.push(root);
while (root.left != null) {
store.push(root.left);
root = root.left;
}
}
}
return list;
}