示例 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
排序的第一個步驟是把數據插入到該二叉樹中
插入基本邏輯是,小、相同的放左邊,大的放右邊框架
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); } }