面试准备--二叉树的非递归遍历(Java版)

函数是写在树类中.
前序和中序都是差不多,不过在于输出的顺序而已.
1. 前序在遍历最左节点时,边遍历边输出.
2. 中序在取出栈顶元素和放入右子树之间时输出.

//中序非递归遍历二叉树
public ArrayList<Integer> zsort(){
        Stack<Node> s = new Stack<Node>();
        ArrayList<Integer> q = new ArrayList<Integer>();
        Node p;
        s.add(root);
        while(!s.empty()){
            p = s.peek();
            while(p!=null){
                s.push(p.getLeft());
                p = p.getLeft();
            }
            s.pop();
            if(!s.empty()){
                p = s.pop();
                q.add(p.getData());
                s.push(p.getRight());
            }
        }
        return q;
    }
//非递归前序遍历二叉树
    public ArrayList<Integer> qsort(){
        Stack<Node> s = new Stack<Node>();
        ArrayList<Integer> q = new ArrayList<Integer>();
        Node p;
        s.push(root);
        while(!s.empty()){
            p = s.peek();
            while(p!=null){
                q.add(p.getData());
                s.push(p.getLeft());
                p = p.getLeft();
            }
            s.pop();
            if(!s.empty()){
                p = s.pop();
                s.push(p.getRight());
            }
        }
        return q;
    }

后序遍历比较麻烦,要保证左右子树必须在根节点之前遍历输出.遍历根节点的条件:无左右子树或者已经遍历了左右子树(遍历的前一个节点就是左右子树).右子树先进栈,这样在出栈的时候就是左子树先出栈.

//非递归后序遍历二叉树
    public ArrayList<Integer> hsort(){
        Stack<Node> s = new Stack<Node>();
        ArrayList<Integer> q = new ArrayList<Integer>();
        Node now = null;
        Node pre = null;
        s.push(root);
        while(!s.empty()){
            now = s.peek();
            if((now.getLeft() == null && now.getRight() == null) || 
               (pre != null &&( pre == now.getLeft() || pre == now.getRight() ) ) ){
                q.add(now.getData());
                s.pop();
                pre = now;
            }
            else
            {
                if(now.getRight()!=null){
                    s.push(now.getRight());
                }
                if(now.getLeft()!=null){
                    s.push(now.getLeft());
                }
            }

        }
        return q;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值