建立二叉樹的兩種方法。
1.陣列表示法
利用陣列來儲存二叉樹的元素。
建立二叉樹的規則:小於等於父節點的值放在左子節點,大於父節點的值放在右子節點。
程式碼如下: /***
-
需求:使用一維陣列儲存二叉樹
-
步驟:
-
1、檢視原始資料的個數(8個),從而制定二叉樹層級(4層),得到滿二叉樹節點個數(15個)
-
2、二叉樹節點(15個)為一維陣列,全設定為0
-
3、迴圈遍歷原始資料,第一個值為樹根
-
4、第二個值與父節點比較,如果大於樹根,則往右子樹比較,如果陣列內的值小於或等於樹根,則往左子樹比較
-
5、【迴圈】步驟4,直到形成二叉樹
-
備註:左節點的座標等於父節點的座標2,右節點的座標等於父節點的座標
if(data[i]>btree[level]) /*如果陣列內的值大於樹根,則往右子樹比較*/ level=level*2+1; else /*如果陣列內的值小於或等於樹根,則往左子樹比較*/ level=level*2; } /*如果子樹節點的值不為0,則再與陣列內的值比較一次*/ System.out.println(); btree[level]=data[i]; /*把陣列值放入二叉樹*/ System.out.print("level後==>"+level+" "); } System.out.print("二叉樹內容:\n"); for (i=1;i<16;i++) System.out.print("["+btree[i]+"] "); System.out.print("\n"); }
}
/*自己的困惑
- 1.level為什麼從一開始。
- 2.不清楚整個迴圈是如何進行的。
- 3.不清楚 for(level=1;btree[level]!=0;)這條語句,
- 4.不清楚每次迴圈之後level的值是多少,也就是不明白迴圈。
- 總結:
- 就是每次從根節點開始與陣列的值比較,大於根節點與其右子樹比較,再把右子樹當做子樹的根節點繼續比較,直到遇到葉子節點就結束迴圈(小於或等於與左子樹比較,後面步驟類似)。
- */
2.連結串列表示法
顧名思義,用連結串列來儲存二叉樹,最簡的二叉連結串列。
程式碼如下:
/program description==/ //自己對於這個演算法還是不太瞭解,主要是建樹的那兩個地方。那兩個指標是如何工作的,裡面存放的是什麼。那個引數是如何傳遞的。 //以上都設計到了程式的執行次序以及構造方法的知識,自己還需要去學習,這裡就不深究,留個疑問先。 package 建立二叉樹_列表表示法; import java.io.*;
//二叉樹結點類宣告
class TreeNode{ int value; TreeNode left_Node; TreeNode right_Node; //TreeNode建構函式 public TreeNode(int value){ this.value = value; this.left_Node = null; this.right_Node = null; }
}
//二叉樹類宣告。
class BinaryTree{ public TreeNode rootNode; //二叉樹的根節點。 public BinaryTree(int[]data){ //建構函式,利用引數建立二叉樹 for(int i = 0;i<data.length;i++){ Add_Node_To_Tree(data[i]); } } void Add_Node_To_Tree(int value){ TreeNode currentNode = rootNode; if(rootNodenull){ //建立樹根 rootNode = new TreeNode(value); return; } //建立二叉樹。 while(true){ if(value<currentNode.value){ //在左子樹。 if(currentNode.left_Nodenull){ currentNode.left_Node = new TreeNode(value); return; } else currentNode = currentNode.left_Node; } else{ if(currentNode.right_Node==null){ //在右子樹。 currentNode.right_Node = new TreeNode(value); return; } else currentNode = currentNode.right_Node; } } } } public class demoBinaryTree { //主函式。 public static void main(String[] args)throws IOException { int ArraySize = 10; int tempdata; int [] content = new int [ArraySize]; BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in)); System.out.println(“請連續輸入”+ArraySize+“個數據”); for(int i = 0;i<ArraySize;i++){ System.out.println(“請輸入第”+(i+1)+“個數據”); tempdata = Integer.parseInt(keyin.readLine()); content[i] = tempdata; //將值傳遞給陣列。 } new BinaryTree(content); //將陣列的值傳遞給二叉樹。 System.out.println("=以連結串列的形式建立二叉樹,成功!!!="); } }