二叉树的三种非递归遍历方法

 public void preOrder1(HereNode Root) {
        if (Root == null) {
            System.out.println("空树");
            return;
        }
        HereNode tmp = Root;
        Stack<HereNode> s = new Stack<HereNode>();
        s.push(tmp);  //根节点入栈
        while (!s.empty()) {
            //1.访问根节点
            HereNode p = s.pop();
            System.out.print(p);
            System.out.println();
            //2.如果根节点存在右孩子,则将右孩子入栈
            if (p.getRight() != null) {
                s.push(p.getRight());
            }
            //3.如果根节点存在左孩子,则将左孩子入栈
            if (p.getLeft() != null) {
                s.push(p.getLeft());
            }
        }
        System.out.println();
    }
    //中序遍历非递归方法,利用栈
    public void midOrder1(HereNode Root) {
        if (Root == null) {
            System.out.println("空树");
            return;
        }
        HereNode tmp = Root;
        Stack<HereNode> s = new Stack<HereNode>();
        while (tmp != null || !s.empty()) {
            //1.将根节点入栈
            //2.将所有左孩子入栈
            while (tmp != null) {
                s.push(tmp);
                tmp = tmp.getLeft();
            }
            //3.访问栈顶元素
            tmp = s.pop();
            System.out.print(tmp);
            System.out.println();
            //4.如果栈顶元素存在右孩子,则将右孩子赋值给tmp,也就是将右孩子入栈
            if (tmp.getRight() != null) {
                tmp = tmp.getRight();
            }
            //否则,将tmp置为null,表示下次要访问的是栈顶元素
            else {
                tmp = null;
            }
        }
        System.out.println();
    }
    //后序遍历非递归方法
    public void postOrder1(HereNode Root) {
        if (Root == null) {
            System.out.println("空树");
            return;
        }
        HereNode tmp = Root;  //当前节点
        HereNode prev = null; //上一次访问的节点
        Stack<HereNode> s = new Stack<HereNode>();
        while (tmp != null || !s.empty()) {
            //1.将根节点及其左孩子入栈
            while (tmp != null) {
                s.push(tmp);
                tmp = tmp.getLeft();
            }

            if (!s.empty()) {
                //2.获取栈顶元素值
                tmp = s.peek();
                //3.没有右孩子,或者右孩子已经被访问过
                if (tmp.getRight() == null || tmp.getRight() == prev) {
                    //则可以访问栈顶元素
                    tmp = s.pop();
                    System.out.print(tmp);
                    System.out.println();
                    //标记上一次访问的节点
                    prev = tmp;
                    tmp = null;
                }
                //4.存在没有被访问的右孩子
                else {
                    tmp = tmp.getRight();
                }
            }
        }
        System.out.println();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值