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); }
}

Java自学-集合框架 二叉树的更多相关文章

  1. Java自学-集合框架 Collections

    Java集合框架 工具类Collections Collections是一个类,容器的工具类,就如同Arrays是数组的工具类 步骤 1 : 反转 reverse 使List中的数据发生翻转 pack ...

  2. Java自学-集合框架 Collection

    Java集合框架 Collection Collection是一个接口 步骤 1 : Collection Collection是 Set List Queue和 Deque的接口 Queue: 先进 ...

  3. Java自学-集合框架 HashSet

    Java集合框架 HashSet 示例 1 : 元素不能重复 Set中的元素,不能重复 package collection; import java.util.HashSet; public cla ...

  4. Java自学-集合框架 HashMap

    Java集合框架 HashMap 示例 1 : HashMap的键值对 HashMap储存数据的方式是-- 键值对 package collection; import java.util.HashM ...

  5. Java自学-集合框架 LinkedList

    Java集合框架 LinkedList 序列分先进先出FIFO,先进后出FILO FIFO在Java中又叫Queue 队列 FILO在Java中又叫Stack 栈 示例 1 : LinkedList ...

  6. Java自学-集合框架 与数组的区别

    Java集合框架与数组的区别 示例 1 : 使用数组的局限性 如果要存放多个对象,可以使用数组,但是数组有局限性 比如 声明长度是10的数组 不用的数组就浪费了 超过10的个数,又放不下 //Test ...

  7. Java自学-集合框架 遍历

    遍历ArrayList的三种方法 步骤 1 : 用for循环遍历 通过前面的学习,知道了可以用size()和get()分别得到大小,和获取指定位置的元素,结合for循环就可以遍历出ArrayList的 ...

  8. Java自学-集合框架 Comparator和Comparable

    Java Comparator和Comparable 步骤 1 : Comparator 假设Hero有三个属性 name,hp,damage 一个集合中放存放10个Hero,通过Collection ...

  9. Java自学-集合框架 聚合操作

    聚合操作 步骤 1 : 聚合操作 JDK8之后,引入了对集合的聚合操作,可以非常容易的遍历,筛选,比较集合中的元素. 像这样: String name =heros .stream() .sorted ...

随机推荐

  1. HTML常用标签一

    html文本格式化标签 在网页中,有时需要为文字设置粗体 .斜体 或下划线 效果,这是就需要用到HTML中的文本格式标签,是文字以特殊的方式显示 标签语义:突出重要性,比普通文字更重要 语义 标签 说 ...

  2. Unity API学习笔记(2)-GameObject的3种Message消息方法

    官方文档>GameObject 首先建立测试对象: 在Father中添加两个脚本(GameObejctTest和Target),分别用来发送Message和接受Message: 在其它GameO ...

  3. 查找字段的筛选-使用addCustomView

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复231或者20161031可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  4. XCode保存问题

    1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中心重新生成一个. 3. 包标识符不与描述文件包含的包标识符不一致,按照它的提示换一下就好了,最好不要点 ...

  5. [20190517]rman tape compressed.txt

    [20190517]rman tape compressed.txt --//前一段测试rman选择压缩备份时,如果备份单个数据文件小于64M-3*8K时,先建立大小64M文件,最后会回收到自己的备份 ...

  6. 利用python去实现数学基本值的计算

    def get_nums(): nums = []#获取列表 num = input('请输入数字:').strip() while num != '': nums.append(num)#添加数字 ...

  7. 关于APICloud与DCloud的我的一些看法

    最近因为项目需要,研究了一下市场较为流行的四种移动开发平台:Wex5.APPcan.Dcloud.APICloud,Wex5因为界面UI较为老旧,且语法和js有较大出入,APPcan不开源等缘故,主要 ...

  8. 【cf343】D. Water Tree(dfs序+线段树)

    传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...

  9. 【BZOJ2138】stone(线段树+hall定理)

    传送门 题意: 现在有\(n\)堆石子,每堆石子有\(a_i\)个. 之后会有\(m\)次,每次选择\([l,r]\)的石子堆中的石子扔\(k\)个,若不足,则尽量扔. 现在输出\(1\)~\(m\) ...

  10. Pwnable-mistake

    先看看c的源码 #include <stdio.h> #include <fcntl.h> #define PW_LEN 10 #define XORKEY 1 void xo ...