vlambda博客
学习文章列表

二叉树先序、中序、后序遍历的非递归实现

一、题目

题目如标题,我们先回顾一下二叉树遍历的递归版本

 public static class Node{
       public int value;
       public Node left;
       public Node right;
       public Node(int data){
           this.value = data;
      }
  }

   public static void preOrderRecur(Node head){
       if(head == null){
           return ;
      }
       System.out.print(head.value + " ");
       preOrderRecur(head.left);
       preOrderRecur(head.right);
  }

   public static void inOrderRecur(Node head){
       if(head == null){
           return ;
      }
       inOrderRecur(head.left);
       System.out.print(head.value + " ");
       inOrderRecur(head.right);
  }

   public static void posOrderRecur(Node head){
       if(head == null){
           return;
      }
       posOrderRecur(head.left);
       posOrderRecur(head.right);
       System.out.print(head.value + " ");
  }

二、分析非递归实现

  • 先序

    • 一个栈,先放入头节点

    • 如果栈非空,弹出一个节点,打印,并先放右再放左

    • 直到栈空

  • 中序

    • 一个栈,把从中间到左边的所有节点(一路左)放入栈中

    • 弹出一个节点,打印,并将其右子树的一路左放入栈中

    • 直到栈为空

  • 后序

    先序遍历的顺序是中左右,那么只需要改变先序压栈的顺序,即可实现中右左的顺序,再设置一个help栈,将本该直接弹出打印的节点压入help栈,最后再从help栈弹出,即为后序遍历的顺序,左右中。

三、非递归实现

 public static void preOrderUnRecur(Node head){
       System.out.print("pre-order: ");
       if(head != null){
           Stack<Node> stack = new Stack<>();
           stack.push(head);
           while(!stack.isEmpty()){
               head = stack.pop();
               System.out.print(head.value + " ");
               if(head.right != null){
                   stack.push(head.right);
              }
               if(head.left != null){
                   stack.push(head.left);
              }
          }
      }
       System.out.println();
  }

   public static void inOrderUnRecur(Node head){
       System.out.print("in-order: ");
       if(head != null){
           Stack<Node> stack = new Stack<>();
           while(head != null || !stack.isEmpty()){
               if(head != null){
                   stack.push(head);
                   head = head.left;
              }
               else{
                   head = stack.pop();
                   System.out.print(head.value + " ");
                   head = head.right;
              }
          }
      }
       System.out.println();
  }

   public static void posOrderUnRecur(Node head){
       System.out.print("pos-order: ");
       if(head != null){
           Stack<Node> stack = new Stack<>();
           Stack<Node> help = new Stack<>();
           stack.push(head);
           while(!stack.isEmpty()){
               head = stack.pop();
               help.push(head);
               if(head.left != null){
                   stack.push(head.left);
              }
               if(head.right != null){
                   stack.push(head.right);
              }
          }
           while(!help.isEmpty()){
               System.out.print(help.pop().value + " ");
          }
      }
       System.out.println();
  }