• 二叉树递归及非递归遍历


      1 package com.company;
      2 
      3 import java.util.ArrayList;
      4 import java.util.LinkedList;
      5 import java.util.List;
      6 import java.util.Queue;
      7 import java.util.Stack;
      8 
      9 /**
     10  * @author wuzhijun <wuzhijun@kuaishou.com>
     11  * Created on 2022-01-13
     12  */
     13 public class TreeNodeOrder {
     14     public static void main(String[] args) {
     15         //        https://www.cnblogs.com/liuyang0/p/6271331.html
     16 
     17         System.out.println("前序遍历");
     18         preOrderRecur(buildTree());
     19         preOrder(buildTree());
     20         System.out.println("中序遍历");
     21         midOrderRecur(buildTree());
     22         midOrder(buildTree());
     23         System.out.println("后续遍历");
     24         postOrderRecur(buildTree());
     25         posOrder(buildTree());
     26         System.out.println("层级遍历");
     27         levelOrderRecur(buildTree());
     28         levelOrder(buildTree());
     29     }
     30 
     31     private static TreeNode buildTree() {
     32 
     33         List<TreeNode> nodes = new ArrayList<>();
     34         for (int i = 0; i <= 10; i++) {
     35             nodes.add(new TreeNode(i));
     36         }
     37         nodes.get(4).setLeft(nodes.get(2));
     38         nodes.get(4).setRight(nodes.get(6));
     39         nodes.get(2).setLeft(nodes.get(1));
     40         nodes.get(2).setRight(nodes.get(3));
     41         nodes.get(6).setLeft(nodes.get(5));
     42         nodes.get(6).setRight(nodes.get(7));
     43         nodes.get(7).setRight(nodes.get(8));
     44         nodes.get(8).setRight(nodes.get(10));
     45         return nodes.get(4);
     46 
     47     }
     48 
     49     //递归前序遍历
     50     private static void preOrderRecur(TreeNode node) {
     51         if (node == null) {
     52             return;
     53         }
     54         System.out.println(node.value);
     55         preOrderRecur(node.left);
     56         preOrderRecur(node.right);
     57     }
     58 
     59     //递归中序遍历
     60     private static void midOrderRecur(TreeNode node) {
     61         if (node == null) {
     62             return;
     63         }
     64         midOrderRecur(node.left);
     65         System.out.println(node.value);
     66         midOrderRecur(node.right);
     67     }
     68 
     69     //递归后序遍历
     70     private static void postOrderRecur(TreeNode node) {
     71         if (node == null) {
     72             return;
     73         }
     74         postOrderRecur(node.left);
     75         postOrderRecur(node.right);
     76         System.out.println(node.value);
     77     }
     78 
     79     //层序遍历
     80     private static void levelOrderRecur(TreeNode node) {
     81         if (node == null) {
     82             return;
     83         }
     84         int depth = depth(node);
     85         for (int i = 1; i <= depth; i++) {
     86             levelOrderRecur(node, i);
     87         }
     88     }
     89 
     90     private static void levelOrderRecur(TreeNode node, int level) {
     91         if (node == null || level < 1) {
     92             return;
     93         }
     94         if (level == 1) {
     95             System.out.println(node.value);
     96         }
     97         levelOrderRecur(node.left, level - 1);
     98         levelOrderRecur(node.right, level - 1);
     99     }
    100 
    101     private static int depth(TreeNode node) {
    102         if (node == null) {
    103             return 0;
    104         }
    105         int leftDepth = depth(node.left);
    106         int rightDepth = depth(node.right);
    107         return Math.max(leftDepth, rightDepth) + 1;
    108     }
    109 
    110 
    111     //非递归先序遍历
    112     private static void preOrder(TreeNode node) {
    113         if (node == null) {
    114             return;
    115         }
    116         Stack<TreeNode> stack = new Stack<>();
    117         stack.push(node);
    118         while (!stack.isEmpty()) {
    119             TreeNode item = stack.pop();
    120             System.out.println(item.getValue());
    121             if (item.getRight() != null) {
    122                 stack.push(item.getRight());
    123             }
    124             if (item.getLeft() != null) {
    125                 stack.push(item.getLeft());
    126             }
    127         }
    128     }
    129 
    130     //非递归中序遍历
    131     private static void midOrder(TreeNode node) {
    132         if (node == null) {
    133             return;
    134         }
    135         Stack<TreeNode> stack = new Stack<>();
    136         while (!stack.isEmpty() || node != null) {
    137             while (node != null) {
    138                 stack.push(node);
    139                 node = node.getLeft();
    140             }
    141             if (!stack.isEmpty()) {
    142                 TreeNode item = stack.pop();
    143                 System.out.println(item.getValue());
    144                 node = item.getRight();
    145             }
    146         }
    147     }
    148 
    149     // 非递归后序遍历
    150     private static void posOrder(TreeNode head) {
    151         if (head == null) {
    152             return;
    153         }
    154         Stack<TreeNode> s1 = new Stack<>();
    155         Stack<TreeNode> s2 = new Stack<>();
    156         s1.push(head);
    157         while (!s1.isEmpty()) {
    158             TreeNode cur = s1.pop();
    159             s2.push(cur);
    160             if (cur.left != null) {
    161                 s1.push(cur.left);
    162             }
    163             if (cur.right != null) {
    164                 s1.push(cur.right);
    165             }
    166         }
    167         while (!s2.isEmpty()) {
    168             TreeNode cur = s2.pop();
    169             System.out.println(cur.getValue());
    170         }
    171     }
    172 
    173 
    174     private static void levelOrder(TreeNode node) {
    175         if (node == null) {
    176             return;
    177         }
    178         Queue<TreeNode> queue = new LinkedList<>();
    179         queue.add(node);
    180         while (!queue.isEmpty()) {
    181             TreeNode item = queue.poll();
    182             System.out.println(item.getValue());
    183             if (item.getLeft() != null) {
    184                 queue.add(item.getLeft());
    185             }
    186             if (item.getRight() != null) {
    187                 queue.add(item.getRight());
    188             }
    189         }
    190     }
    191 
    192 }
  • 相关阅读:
    android progressbar 水平进度条
    jquery 下拉自动加载
    jquery ajax
    input 数字,字母汉字的限制方法(转帖)
    Jquery checkbox
    js运用6
    js运用5
    js运用4
    js运用3
    js运用2
  • 原文地址:https://www.cnblogs.com/wzj4858/p/15797814.html
Copyright © 2020-2023  润新知