Binary Tree Inorder Traversal 二叉树的中序遍历(迭代非递归版本)

来源:互联网 发布:金山软件有哪些 编辑:程序博客网 时间:2024/05/20 22:39

二叉树的遍历如果用递归的话,是比较好做的。

这里,选择有挑战一点的解法:迭代直接求解。

首先,我们先造一个二叉树。

中序遍历需要先访问完左边的子树,才能访问中间的,最后访问右边子树。

我们自己先模拟中序遍历,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;    }


1 0
原创粉丝点击