zoukankan      html  css  js  c++  java
  • 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 }

    运行结果:

  • 相关阅读:
    [转]Flash Builder 4安装SVN插件
    [转]ActionScript为什么不支持函数重载
    [转]Flash Builder 4 官网下载、安装与注册
    ActionScript3.0导入XML数据
    Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx
    Flex与.NET互操作(八):使用FluorineFx网关实现远程访问
    Flex—鼠标样式设置
    Shape、Sprite 和 MovieClip 对象的 graphics 属性(graphics类)的简单用法
    IN&EXISTS与NOT IN&NOT EXISTS 的优化原则的讨论
    Windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于 本地计算机 上)。错误 1067: 进程意外终止。
  • 原文地址:https://www.cnblogs.com/ccxka/p/9600520.html
Copyright © 2011-2022 走看看