二叉树遍历的非递归方法

https://blog.csdn.net/qiuxinfa123/article/details/84880786
2.先序遍历。非递归先序遍历的思路如下:
1.先将根节点入栈
2.访问根节点
3.如果根节点存在右孩子,则将右孩子入栈
4.如果根节点存在左孩子,则将左孩子入栈(注意:一定是右孩子先入栈,然后左孩子入栈)
5.重复2-4

//先序遍历非递归
    public void preOrder2(){
        Stack<Node> stack = new Stack();
        Node p = root;
        stack.push(p);
        while (!stack.empty()){
             p = stack.pop();
            //输出当前节点
            System.out.println(p);
            //右节点不为空入栈
            if (p.right != null){
                stack.push(p.right);
            }
            if (p.left != null){
                stack.push(p.left);
            }
        }
    }

3.中序遍历。 非递归中序遍历的思路如下:
1.先将根节点入栈
2.将当前节点的所有左孩子入栈,直到左孩子为空
3.访问栈顶元素,如果栈顶元素存在右孩子,则继续第2步
4.重复第2、3步,直到栈为空并且所有的节点都被访问

  //中序遍历非递归
  public void infixOrder2(){
      Stack<Node> stack = new Stack<>();
      Node p = root;

      while (p != null || !stack.empty()){
          //根节点和当前节点的所有左子节点入栈
          while (p != null){
              stack.push(p);
              p = p.left;
          }

          //访问栈顶
          p = stack.pop();
          //输出
          System.out.println(p);

          if (p.right != null){
              p = p.right;
          }else {
              p = null;
          }

      }
  }

4.后序遍历。 后续遍历的非递归实现思路:
1.根节点入栈
2.将根节点的左子树入栈,直到最左,没有左孩子为止
3.得到栈顶元素的值,先不访问,判断栈顶元素是否存在右孩子,如果存在并且没有被访问,则将右孩子入栈,否则,就访问栈顶元素

   //后序遍历非递归
   public void postOrder2(){
       Stack<Node> stack = new Stack<>();
       Node p = root;
       Node pre = null;//上一次访问的节点
       while (p!=null || !stack.empty()){
           //根节点和所以左孩子入栈
           while (p != null){
               stack.push(p);
               p = p.left;
           }

           //访问栈顶元素但不出栈
           p = stack.peek();

           if (p.right == null || p.right == pre){
               p = stack.pop();
               System.out.println(p);
               pre = p;
               p = null;
           }else {
               p = p.right;
           }
       }
   }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值