zoukankan      html  css  js  c++  java
  • 二叉树四种遍历(递归+非递归)

    一、先序遍历

    思路:先输出当前节点,前序遍历左子树,前序遍历右子树

     1  //先序遍历
     2     //递归
     3     public static void  preOrder(BitNode root){
     4         root.visitNode();
     5         if(root.lchild != null)
     6             preOrder(root.lchild);
     7         if(root.rchild != null)
     8             preOrder(root.rchild);
     9 
    10     }
    11 //非递归,先输出再入栈
    12     public static void preOrder1(BitNode root){
    13         Stack<BitNode> stack = new Stack<BitNode>();
    14         while(root != null || !stack.empty()){
    15             while(root != null){  //沿左孩子走到底,同时输出
    16                 System.out.print(root.data+" ");
    17                 stack.push(root);
    18                 root = root.lchild;
    19             }
    20             if(!stack.empty()){  //出栈,并将非空右孩子入栈
    21                 root = stack.pop();
    22                 root = root.rchild;
    23             }
    24
    25         }
    26     }

    二、中序遍历

    思路:中序遍历左子树,输出当前节点,中序遍历右子树

     1 //中序遍历
     2     //递归
     3     public static void inOrder(BitNode root){
     4         if(root.lchild != null){
     5             inOrder(root.lchild);
     6         }
     7        root.visitNode();
     8         if(root.rchild != null){
     9             inOrder(root.rchild);
    10         }
    11     }
    12     //非递归,先入栈,后面先出栈再输出,出栈后将非空右孩子压入栈,空则继续弹出
    13     public static void inOrder1(BitNode root) {
    14         Stack<BitNode> stack = new Stack<>();
    15         while (root != null || !stack.empty()) {
    16             while (root != null) {
    17                 stack.push(root);
    18                 root = root.lchild;
    19             }
    20             if (!stack.empty()) {
    21                 root = stack.pop();
    22                 System.out.print(root.data+" ");
    23                 root = root.rchild;
    24             }
    25         }
    26     }

    三、后序遍历

    思路:后序遍历左子树,后序遍历右子树,输出当前节点

     1 //后序遍历
     2     //递归
     3     public static void postOrder(BitNode root){
     4         if(root.lchild != null){
     5             postOrder(root.lchild);
     6         }
     7         if(root.rchild != null){
     8             postOrder(root.rchild);
     9         }
    10         root.visitNode();
    11     }
    12     //非递归
    13     public static void postOrder1(BitNode root){
    14         Stack<BitNode> stack = new Stack<>();
    15         BitNode pre = null,cur;
    16         stack.push(root);
    17         while (!stack.empty()){
    18             cur = stack.peek();
    19             //若栈顶节点当前无左右节点则可输出并出栈,或者其左右节点被访问过(左节点:说明无右节点,右节点:说明有左右节点或者无左节点)
    20             if((cur.lchild == null && cur.rchild == null)||(pre != null && (pre == cur.lchild ||pre == cur.rchild))){
    21                 cur.visitNode();
    22                 stack.pop();
    23                 pre = cur;
    24             }
    25             else {//注意顺序,先放入右节点,再放入左节点,后进先出
    26                 if(cur.rchild != null)
    27                     stack.push(cur.rchild);
    28                 if(cur.lchild != null)
    29                     stack.push(cur.lchild);
    30             }
    31         }
    32 
    33     }

    四、层次遍历

    思路:利用队列先进先出,左右孩子进入队列后,当前节点从队列中删除

     1  //层次遍历,根据队列来控制循环,出队并输出,将左右孩子入队
     2     // 首先将根节点入队,队列若不为空则出队一个节点并输出,然后判断其左右节点是否为空,不为空则则入队
     3     public static void levelTraverse(BitNode root){
     4         Queue<BitNode>  queue = new LinkedList<BitNode>();
     5         queue.offer(root);
     6         while(!queue.isEmpty()){
     7             BitNode bitNode = queue.poll();
     8             bitNode.visitNode();
     9             if(bitNode.lchild != null)
    10                 queue.offer(bitNode.lchild);
    11             if(bitNode.rchild != null)
    12                 queue.offer(bitNode.rchild);
    13         }
    14     }
  • 相关阅读:
    .net core使用 AutoMapper
    使用 ASP.NET Core 和 Entity Framework Core 入门
    使用vue-quill-editor图片上传
    使用NPOI 做Excel导出
    利用SmtpClient类发送邮件
    使用Area(区域)会遇到的问题
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器
    MySQL的内存都用在了哪里
    (转载)MySQL buffer pool中三种page以及链表
    MySQL8.0备份工具之Xtrabackup
  • 原文地址:https://www.cnblogs.com/lizijiangmm/p/8783011.html
Copyright © 2011-2022 走看看