• 二叉树四种遍历(递归+非递归)


    一、先序遍历

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

     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     }
  • 相关阅读:
    java学习(4):第一个Java程序(Hello world)
    java学习(3):字符集和字符编码的区别
    java学习(2):二进制、十进制、原码、反码、补码
    Java学习(1):JRE和JDK
    缓存
    关联表查询
    男0女1
    嵌套查询
    定义别名
    增删改查
  • 原文地址:https://www.cnblogs.com/lizijiangmm/p/8783011.html
Copyright © 2020-2023  润新知