接前-后序遍历二叉树(非递归)

来源:互联网 发布:神圣罗马帝国历史 知乎 编辑:程序博客网 时间:2024/05/17 22:35

思路:

对于节点p可以分情况讨论
1. p如果是叶子节点,直接输出
2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
3. p如果有孩子,而且孩子都已经访问过,则访问p节点


实现方法:每次押入两个同样的节点入栈,则一次代表已访问,一次代表未访问

上代码:


class Node {    int data;    Node left, right;    Node(int item) {        data = item;        left = right = null;    }}class BinaryTree {    Node root;    public List<Integer> iterativePostOrder() {        List<Integer> res = new ArrayList<>();        if (root == null) {            return res;        }        Node p = root;        Stack<Node> sta = new Stack<>();        sta.push(p);        sta.push(p);        while (!sta.empty()) {            p = sta.peek();            sta.pop();            if (!sta.isEmpty() && p == sta.peek()) {                if (p.right != null) {                    sta.push(p.right);                    sta.push(p.right);                }                if (p.left != null) {                    sta.push(p.left);                    sta.push(p.left);                }            }else {                    res.add(p.data);            }        }        return res;    }}


阅读全文
0 0
原创粉丝点击