Java自學-集合框架 二叉樹

Java集合框架 二叉樹

示例 1 : 二叉樹概念html

二叉樹由各類節點組成
二叉樹特色:
每一個節點均可以有子節點,子節點
每個節點都有一個
二叉樹概念java

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同樣大,放在左邊
    二叉樹排序-插入數據dom

    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或者數組的形式設計

二叉樹的遍歷分左序,中序,右序
左序即: 中間的數遍歷後放在左邊
中序即: 中間的數遍歷後放在中間
右序即: 中間的數遍歷後放在右邊
如圖所見,咱們但願遍歷後的結果是從小到大的,因此應該採用中序遍歷
二叉樹排序-遍歷code

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

練習英雄二叉樹htm

根據上面的學習和理解,設計一個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);
 
    }
}
相關文章
相關標籤/搜索