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 }

效果图:

原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/12218895.html