• java 二叉树的创建 遍历


    本来说复习一下BFS和DFS,辗转就来到了二叉树...本文包括二叉树的创建和遍历

    概念

      数据:1 2 3 4 5 6 7生成一颗二叉树

    上面的数是数据,不是位置,要区别一下数据和位置

    红色的代表位置,黑色的代表数据,数据是通过数组给的

    看红色的标记,每一个父节点的左儿子是 当前值*2+1 右儿子是 当前值*2+2,我们是从0开始编号的,如果是-1开始编号,则为x*2 、x*2+1

    有了上面这个公式就会变得很简单,既然要生成一颗数,那么每个节点是必不可少的,就要定义一个节点类,里面包含当前值,左右儿子,左右儿子一个个往下指,就形成了 一棵树

    在生成二叉树的时候,考虑到最后一个节点,上图数组的长度是8,此时没有右节点,如果为9,就有右节点

    得到结果:length%2 == 0 只有左节点 length%2 == 1 左右都有

     遍历

      先序遍历:根左右

      中序遍历:左根右

      后序遍历:左右根

      

      有一个很简单的记忆方法,先中后代表根的位置,左右相对位置永远不变

      在程序里采用递归的方式进行实现

     1 package tree;
     2 
     3 import java.util.LinkedList;
     4 import java.util.List;
     5 
     6 public class Tree {
     7     
     8     private static class Node{
     9         Node left;
    10         Node right;
    11         int val;
    12         
    13         Node(int data){
    14             left = null;
    15             right = null;
    16             val = data;
    17         }
    18     }
    19     
    20     //生成一颗二叉树
    21     public static List<Node> CreatTree(int[] array){
    22         
    23         List<Node> nodelist = new LinkedList<>();
    24         //每个位置转换成节点
    25         for(int i = 0; i<array.length; i++){
    26             nodelist.add(new Node(array[i]));
    27         }
    28         //按照关系建立二叉树
    29         for(int i=0; i<array.length/2-1; i++){
    30             //左孩子
    31             nodelist.get(i).left = nodelist.get(i*2+1);
    32             //右孩子
    33             nodelist.get(i).right = nodelist.get(i*2+2);
    34         }
    35         //最后一个节点特殊处理
    36         int index = array.length / 2 - 1;
    37         //左孩子
    38         nodelist.get(index).left = nodelist.get(index*2+1);
    39         //如果长度是奇数,那就有右孩子
    40         if(array.length%2 == 1){
    41             nodelist.get(index).right = nodelist.get(index*2+2);
    42         }
    43         
    44         return nodelist;
    45     }
    46     
    47     //先序遍历(根、左、右)
    48     public static void preOrderTraverse(Node node){
    49         if(node == null) return;
    50         //
    51         System.out.print(node.val + " ");
    52         //
    53         preOrderTraverse(node.left);
    54         //
    55         preOrderTraverse(node.right);
    56     }
    57     
    58     //中序遍历
    59     public static void inOrderTraverse(Node node){
    60         if(node == null) return;
    61         //
    62         inOrderTraverse(node.left);
    63         //
    64         System.out.print(node.val + " ");
    65         //
    66         inOrderTraverse(node.right);
    67     }
    68     
    69     //后序遍历
    70     public static void postOrderTraverse(Node node){
    71         if(node == null) return;
    72         //
    73         postOrderTraverse(node.left);
    74         //
    75         postOrderTraverse(node.right);
    76         //
    77         System.out.print(node.val + " ");
    78     }
    79     
    80     
    81     public static void main(String[] args) {
    82         int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
    83         //获取根节点
    84         Node root = Tree.CreatTree(array).get(0);
    85         
    86         System.out.println("先序遍历:");  
    87         preOrderTraverse(root);  
    88         System.out.println();
    89         
    90         System.out.println("中序遍历:");  
    91         inOrderTraverse(root);  
    92         System.out.println(); 
    93         
    94         System.out.println("后序遍历:");  
    95         postOrderTraverse(root);  
    96         System.out.println(); 
    97     }
    98     
    99 }

    运行结果:

  • 相关阅读:
    eCryptfs文件系统测试
    体验企业级网络管理软件(图片加视频)
    基于Linux2.6内核的加密容器法保护文件方法
    Orion Network Performance Monitor 软件在网络管理中的应用
    两款硬件代理服务器产品之比较
    3Com Network Supervisor与IBM Tivoli NetView两款网管软件操作视频
    成为IBM精英讲师-一分耕耘 一份收获 同时也多了一份责任!
    Hp Open View安装使用视频
    在Fedora 14 alpha 下测试Kvm情况(视频)
    ACM模板——分数类
  • 原文地址:https://www.cnblogs.com/ccxka/p/9600520.html
Copyright © 2020-2023  润新知