关于二叉树遍历

1.关于二叉树的问题

首先介绍一下二叉树遍历的方式:分为先序遍历(根、左、又)、中序遍历(左、根、右)、后序遍历(左、右、根)

关于二叉树的遍历用java代码实现

(1)使用递归的方式实现二叉树的遍历这是一种最基本的实现方式

public class Node(){

     public int value;

     public Node left;

     public Node right;

     public Node(int data){

              this.value=data;

     }

      //先序遍历

     public void preOrderRecur(Node head){

              if(head==null){

                   return;

               }

              System.out.print(head.value+"");

               preOrderRecur(head.left);

               preOrderRecur(head.right);

     }

     //中序遍历

     public void inOrderRecur(Node head){

              if(head==null){

                   return;

               } 

               inOrderRecur(head.left);

                System.out.print(head.value+"");

               inOrderRecur(head.right);

     }

     //后序遍历

     public void posOrderRecur(Node head){

              if(head==null){

                   return;

               }

               posOrderRecur(head.left);

               posOrderRecur(head.right);

             System.out.print(head.value+"");

     }

}

(2)使用非递归的方式实现二叉树(即使用迭代栈的方式来实现)

//先序遍历

 public void preOrderRecur(Node head){

            System.out.print("pre-order");

             if(head !=null){

                  Stack<Node> stack=new Stack<Node>();

                  stack.add(head);

                  while(!stack.isEmpty()){

                          head=stack.pop();

                          System.out.print(head.value+"");

                          if(head.right !=null){

                              stack.push(head.right);

                           }

                          if(head.right !=null){

                               stack.push(head.left);

                           }          

              }        

        }

           System.out.println();

}

//中序遍历

public void inOrderRecur(Node head){

      System.out.print(“in-order”);

        if(head != null){

            Stack<Node> stack=new Stack<Node>();

               while(!stack.isEmpty || head !=null){

                     if(head !=null){

                        stack.push(head);

                        head=stack.left;

                    }else{

                       head=stack.pop();

                      System.out.print(head.value+"");

                      head=head.right;     

                   }

              }  

        }

            System.out.println();

}

//后序遍历(用两个栈实现的后序遍历方式)

public void posOrderRecur(Node head){

    System.out.print("pos-order");

     if(head !=null){

       Stack<Node> s1=new Stack<Node>();

       Stack<Node>  s2=new Stack<Node>();

       s1.pop();

       while(!s1.isEmpty()){

          head=s.pop(); 

          s2.push(head);

         if(head.left !=null){

           s1.push(head.left);

         }

        if(head.right !=null){

            s1.push(head.right);

        }

}

        while( !s2.isEmpty()){

           System.out.print(s2.pop().value+"");

        }     

   }

  System.out.println();

}

//用一个栈实现后序遍历的排序

public void posOrderRecur(Node head){

   System.out.print("pos-order");

   if(head!=null){

   Stack<Node> stack=new Stack<Node>();

   stack.push(head);

   Node c=null;

   while(!stack.isEmpty()){

     c=stack.peek();

    if(c.left !=null&& head!=c.left && head !=c.right){

          stack.push(c.left);

     }else if(c.right !=null &&  head !=c.right){

              stack.push(c.right);

    }else{

      System.out.print(stack.pop().value+"");

       head=c;

           }  

      }

  }

  System.out.println();

}

(3)遍历二叉树的神级方法(本质上用的是Morris遍历):二叉树的节点为N时间复杂度为O(N),额度空间复杂度为O(1)

public class Node(){

    public int value;

    public Node left;

    public Node right;

    public Node(int data){

        this.value=data;

    }

//先序遍历

   public void morrisIn(Node head){

         if(head==null){

              return;

        }

        Node cur1=head;

        Node cur2=null;

        while(cur1 !=null){

             cur2=cur1.left;

            if(cur2!=null){

                 while(cur2.right !=null && cur2.right !=cur1){

                           cur2=cur2.right;

                }  

                if(cur2.right==null){

                    cur2.right=cur1;

                   cur1=cur1.left;

                  continue;

                }else {

                    cur2.right=null;

               }

               System.out.print(cur1.value+"");

                   cur1=cur1.right;

            }

            System.out.println();

        }

 }

//中序遍历

public void morrisPre(Node head){

             if(head==null){

                  return;

            }

           Node cur1=head;

           Node cur2=null;

          while(cur1 !=null){

                cur2=cur1.left;

               if(cur2 !=null){

                  while(cur2.right !=null && cur2.right !=cur1){   

                            cur2=cur2..right;           

                 }            

                 if(cur2.right ==null){

                          cur2.right=cur1;

                          System.out.print(cur1.value+"");

                           cur1=cur1.left;

                            continue;

                 }else {

                        cur2.right=null;

                }

               }else {

                      System.out.print(cur1.value+"");

               }         

                  cur1=cur1.right;

          }

      System.out.println();

}

//后序遍历

public void morrisPos(Node head){     

      if(head==null){

           return;

      }

     Node cur1=head;

     Node cur2=null;

    while(cur1 !=null){     

           cur2=cur1.left;

           if(cur2 !=null){

             while(cur2.right !=null && cur2.right !=cur1){

                        cur2=cur2.right;

              }

               if(cur2.right==null){

                    cur2.right=cur1;

                    cur1=cur1.left;

                    continue;

               }else{

                       cur2.right=null;

                        printEdge(cur1.left);

               }

           }

         cur1=cur1.right;

}

       printEdge(head);

       System.out.println();

}

public void printEdge(Node head){

      Node tail=reverseEdge(head);

       Node cur=tail;

      while(cur !=null){

          System.out.print(cur.value+"");

           cur=cur.right;

      }

      reverseEdge(tail);

public Node reverseEdge(Node from){

    Node pre=null;

    Node next=null;

   while(from !=null){

     next=from.right;

     from.night=pre;

     pre=from;

     from=next;

   }

      return pre;

  }















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值