二叉树的后序遍历(递归和非递归)

来源:互联网 发布:问卷星如何录入数据 编辑:程序博客网 时间:2024/06/05 09:36

对于二叉树的后序遍历,最常用的就是递归,代码清晰,如下:

ArrayList<Integer> list = new ArrayList<>();    public ArrayList<Integer> postorderTraversal(TreeNode root) {        if(root == null)            return list;        sort(root);        return list;    }    private void sort(TreeNode root){        if(root == null)            return;        sort(root.left);        sort(root.right);        list.add(root.val);    }

但是当二叉树高度很大的时候,递归就容易导致栈溢出,所以就需要将递归改为非递归方式,代码如下:

public ArrayList<Integer> postorderTraversal(TreeNode root) {        ArrayList<Integer> list = new ArrayList<>();        if(root == null)            return list;        Stack<TreeNode> s = new Stack<>();        TreeNode p = root;        TreeNode r = null;//用来记录上次被访问的节点        while(p != null || !s.isEmpty()){            if(p != null){                s.push(p);                p = p.left;            }else{                p = s.peek();                p = p.right;                if(p != null && p != r){                    s.push(p);                    p = p.left;                }else{                    p = s.pop();                    list.add(p.val);                    r = p;                    p = null;                }            }        }        return list;    }
阅读全文
0 0