1. 程式人生 > >建立二叉樹的兩種方法。

建立二叉樹的兩種方法。

1.陣列表示法

利用陣列來儲存二叉樹的元素。
建立二叉樹的規則:小於等於父節點的值放在左子節點,大於父節點的值放在右子節點。

程式碼如下: /***

  • 需求:使用一維陣列儲存二叉樹

  • 步驟:

  • 1、檢視原始資料的個數(8個),從而制定二叉樹層級(4層),得到滿二叉樹節點個數(15個)

  • 2、二叉樹節點(15個)為一維陣列,全設定為0

  • 3、迴圈遍歷原始資料,第一個值為樹根

  • 4、第二個值與父節點比較,如果大於樹根,則往右子樹比較,如果陣列內的值小於或等於樹根,則往左子樹比較

  • 5、【迴圈】步驟4,直到形成二叉樹

  • 備註:左節點的座標等於父節點的座標2,右節點的座標等於父節點的座標

    2+1 / package 建立二叉樹_陣列表示法; import java.io.; public class demoBinTree{ public static void main(String args[]) throws IOException { int i,level; int data[]={6,3,5,9,7,8,4,2}; /原始陣列/ int btree[]=new int[16]; for(i=0;i<16;i++) btree[i]=0; System.out.print(“原始陣列內容: \n”); for(i=0;i<8;i++) System.out.print("["+data[i]+"] “); System.out.println(); for(i=0;i<8;i++) /把原始陣列中的值逐一對比
    / { System.out.println(“i==>”+i); for(level=1;btree[level]!=0;) /比較樹根及陣列內的值/ { System.out.println(“levele==>”+level+” btree[level]==>"+btree[level]);

             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("=以連結串列的形式建立二叉樹,成功!!!="); } }