java学习-排序二叉树
Posted 细雨轻风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
效果图:
以上是关于java学习-排序二叉树的主要内容,如果未能解决你的问题,请参考以下文章