• Java自学-集合框架 二叉树


    Java集合框架 二叉树

    示例 1 : 二叉树概念

    二叉树由各种节点组成
    二叉树特点:
    每个节点都可以有子节点,子节点
    每一个节点都有一个
    二叉树概念

    package collection;
     
    public class Node {
        // 左子节点
        public Node leftNode;
        // 右子节点
        public Node rightNode;
        // 值
        public Object value;
    }
    

    示例 2 : 二叉树排序-插入数据

    假设通过二叉树对如下10个随机数进行排序
    67,7,30,73,10,0,78,81,10,74
    排序的第一个步骤是把数据插入到该二叉树中
    插入基本逻辑是,小、相同的放左边,大的放右边

    1. 67 放在根节点

    2. 7 比 67小,放在67的左节点

    3. 30 比67 小,找到67的左节点7,30比7大,就放在7的右节点

    4. 73 比67大, 放在67的右节点

    5. 10 比 67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,放在30的左节点。
      ...
      ...

    6. 10比67小,找到67的左节点7,10比7大,找到7的右节点30,10比30小,找到30的左节点10,10和10一样大,放在左边
      二叉树排序-插入数据

       package collection;
       
       public class Node {
           // 左子节点
           public Node leftNode;
           // 右子节点
           public Node rightNode;
         
           // 值
           public Object value;
         
           // 插入 数据
           public void add(Object v) {
               // 如果当前节点没有值,就把数据放在当前节点上
               if (null == value)
                   value = v;
         
           // 如果当前节点有值,就进行判断,新增的值与当前值的大小关系
           else {
               // 新增的值,比当前值小或者相同
                
               if ((Integer) v -((Integer)value) <= 0) {
                   if (null == leftNode)
                       leftNode = new Node();
                   leftNode.add(v);
               }
               // 新增的值,比当前值大
               else {
                   if (null == rightNode)
                       rightNode = new Node();
                   rightNode.add(v);
               }
      
           }
      
       }
      
       public static void main(String[] args) {
      
           int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
      
           Node roots = new Node();
           for (int number : randoms) {
               roots.add(number);
           }
      
        }
       }
      

    示例 3 : 二叉树排序-遍历

    通过上一个步骤的插入行为,实际上,数据就已经排好序了。 接下来要做的是看,把这些已经排好序的数据,遍历成我们常用的List或者数组的形式

    二叉树的遍历分左序,中序,右序
    左序即: 中间的数遍历后放在左边
    中序即: 中间的数遍历后放在中间
    右序即: 中间的数遍历后放在右边
    如图所见,我们希望遍历后的结果是从小到大的,所以应该采用中序遍历
    二叉树排序-遍历

    package collection;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Node {
        // 左子节点
        public Node leftNode;
        // 右子节点
        public Node rightNode;
      
        // 值
        public Object value;
      
        // 插入数据
        public void add(Object v) {
            // 如果当前节点没有值,就把数据放在当前节点上
            if (null == value)
                value = v;
      
            // 如果当前节点有值,就进行判断,新增的值与当前值的大小关系
            else {
                // 新增的值,比当前值小或者相同
                 
                if ((Integer) v -((Integer)value) <= 0) {
                    if (null == leftNode)
                        leftNode = new Node();
                    leftNode.add(v);
                }
                // 新增的值,比当前值大
                else {
                    if (null == rightNode)
                        rightNode = new Node();
                    rightNode.add(v);
                }
      
            }
      
        }
      
     // 中序遍历所有的节点
        public List<Object> values() {
            List<Object> values = new ArrayList<>();
      
            // 左节点的遍历结果
            if (null != leftNode)
                values.addAll(leftNode.values());
      
            // 当前节点
            values.add(value);
      
            // 右节点的遍历结果
            if (null != rightNode)
      
                values.addAll(rightNode.values());
      
            return values;
        }
      
        public static void main(String[] args) {
      
            int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
      
            Node roots = new Node();
            for (int number : randoms) {
                roots.add(number);
            }
      
            System.out.println(roots.values());
      
        }
    }
    

    练习英雄二叉树

    根据上面的学习和理解,设计一个Hero二叉树,HeroNode.
    可以向这个英雄二叉树插入不同的Hero对象,并且按照Hero的血量倒排序。

    随机生成10个Hero对象,每个Hero对象都有不同的血量值,插入这个HeroNode后,把排序结果打印出来。
    在这里插入图片描述

    package collection;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import charactor.Hero;
     
    public class HeroNode {
     
        public HeroNode leftHero;
     
        public HeroNode rightHero;
     
        // 声明为Hero类型
        public Hero value;
     
        public void add(Hero v) {
     
            if (null == value)
                value = v;
     
            else {
     
                // 如果新英雄血量,比本节点大,就放在左边
                if (v.hp > value.hp) {
                    if (null == leftHero)
                        leftHero = new HeroNode();
                    leftHero.add(v);
                }
     
                else {
                    if (null == rightHero)
                        rightHero = new HeroNode();
                    rightHero.add(v);
                }
     
            }
     
        }
     
        public List<Object> values() {
            List<Object> values = new ArrayList<>();
     
            if (null != leftHero)
                values.addAll(leftHero.values());
     
            values.add(value);
     
            if (null != rightHero)
     
                values.addAll(rightHero.values());
     
            return values;
        }
     
        public static void main(String[] args) {
     
            List<Hero> hs = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Hero h = new Hero();
                h.name = "hero " + i;
                h.hp = (float) (Math.random() * 900 + 100); // 100-1000的随机血量
                hs.add(h);
            }
            System.out.println("初始化10个Hero");
            System.out.println(hs);
     
            HeroNode heroTree = new HeroNode();
            for (Hero hero : hs) {
                heroTree.add(hero);
            }
            System.out.println("根据血量倒排序后的Hero");
            List<Object> treeSortedHeros = heroTree.values();
            System.out.println(treeSortedHeros);
     
        }
    }
    
  • 相关阅读:
    thinkphp5 tp5 命名空间 报错 Namespace declaration statement has to be the very first statement in the script
    开启 php 错误 提示 php-fpm 重启 nginx 500错误 解决办法 wdlinux lnmp 一键包 php脚本无法解析执行
    js 设置 cookie 定时 弹出层 提示层 下次访问 不再显示 弹窗 getCookie setCookie setTimeout
    php 二维数组 转字符串 implode 方便 mysql in 查询
    nginx 重启 ps -ef|grep nginx kill -HUP 主进程号
    jquery bootstrap help-block input 表单 提示 帮助 信息
    jquery 倒计时 60秒 短信 验证码 js ajax 获取
    jQuery如何获取同一个类标签的所有的值 遍历
    linux下C语言文件操作相关函数
    gcc,gdb用法
  • 原文地址:https://www.cnblogs.com/jeddzd/p/11955731.html
Copyright © 2020-2023  润新知