• java学习-排序二叉树


    (排序)二叉树的创建及中序遍历

    写起来比C复杂一点,思路大同小异~

     1 package Collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 /*
     6  * (排序)二叉树的创建及中序遍历
     7  */
     8 public class Node {
     9     public Node LNode;
    10     public Node RNode;
    11     public Object value; // 结点的值
    12 
    13     public void add(Object v) { // 传入的参数是要加入二叉树的新结点的值,是数值!!!
    14         if (this.value == null) {
    15             value = v;
    16         } else {
    17             if ((Integer) v > (Integer) value) { // 新增的结点的值大于当前结点的值
    18                 if (RNode == null) { // 当前结点右子树为空,要新建右子树结点
    19                     RNode = new Node(); // 使当前结点的右子树指向新增的结点,此时RNode的value自然没有赋值,是null
    20                 }
    21                 // 如果RNode非空,说明该结点右子树非空,则在右子树的基础上继续调用add以把数值v添加到二叉树正确的位置,
    22                 // 如果RNode为空,自然是上面新建右子树结点,并且由于此时RNode的value肯定是null,于是调用本身的add方法,把v赋值到RNode的value
    23                 RNode.add(v);
    24             } else { // 新增的结点的值小于当前结点的值
    25                 if (LNode == null) {
    26                     LNode = new Node();
    27                 }
    28                 LNode.add(v);
    29             }
    30         }
    31 
    32     }
    33 
    34     // 二叉树的中序遍历,若二叉树本身是排序二叉树,则中序遍历能“有序输出”所有结点数值
    35     public List<Object> values() { // 返回类型是List
    36         List<Object> values = new ArrayList<Object>(); // 用来保存中途遍历的结果
    37         if (LNode != null) {
    38             values.addAll(LNode.values()); // 左子树非空,递归的“递”
    39         }
    40 
    41         values.add(value); // 把当前结点数值保存到values列表
    42 
    43         if (RNode != null) {
    44             values.addAll(RNode.values()); // 右子树非空,递归的“递”
    45         }
    46 
    47         return values; // 递归的“归”,先上层返回中途遍历结果
    48 
    49     }
    50 
    51     public static void main(String[] args) {
    52         int randoms[] = new int[] { 67, 7, 30, 73, 10, 0, 78, 81, 10, 74 };
    53         Node roots = new Node();
    54         for (int number : randoms) {    //建立(排序)二叉树
    55             roots.add(number);
    56         }
    57         System.out.println(roots.values());  //打印中序遍历结果
    58     }
    59 }

    效果图:

    2.设计一个Hero二叉树,HeroNode.
    可以向这个英雄二叉树插入不同的Hero对象,并且按照Hero的血量倒排序。
    随机生成10个Hero对象,每个Hero对象都有不同的血量值,插入这个HeroNode后,把排序结果打印出来。

     1 package Collection;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import charactor.Hero;
     7 
     8 public class HeroNode {
     9     public HeroNode LNode;
    10     public HeroNode RNode;
    11     public Hero h;        //这里是Hero类作为结点的值
    12 
    13     public void add(Hero v) {    //根据Hero的hp来进行插入判断
    14         if (h == null)
    15             h = v;
    16         else {
    17             if ((float) v.hp < (float) h.hp) {
    18                 if (RNode == null)
    19                     RNode = new HeroNode();
    20                 RNode.add(v);
    21             } else {
    22                 if (LNode == null)
    23                     LNode = new HeroNode();
    24                 LNode.add(v);
    25             }
    26         }
    27 
    28     }
    29 
    30     public List<Hero> values() {    //排序二叉树添加结点
    31         List<Hero> values = new ArrayList<>();
    32         if (LNode != null)
    33             values.addAll(LNode.values());
    34 
    35         values.add(h);    //传入的参数类型是Hero
    36 
    37         if (RNode != null)
    38             values.addAll(RNode.values());
    39 
    40         return values;
    41     }
    42 
    43     public static void main(String[] args) {
    44 
    45         HeroNode root = new HeroNode();
    46 
    47         for (int i = 0; i < 10; i++) {
    48             Hero h = new Hero("Hero " + i);
    49             h.hp = Math.round(Math.random() * 1000);
    50             root.add(h);
    51         }
    52 
    53         List<Hero> heros = root.values();
    54 
    55         for (Hero h : heros) {
    56             System.out.println(h + "  hp:" + h.hp);
    57         }
    58     }
    59 }

    效果图:

  • 相关阅读:
    c++ primer plus 第六章 课后题答案
    动态创建easyui控件的渲染问题
    晨报
    动态构建easyUI grid
    早起
    周末
    js ajax方式拼接参数
    5个月
    锻炼
    东湖夜色
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/12218895.html
Copyright © 2020-2023  润新知