二元樹排序法

      在〈二元樹排序法〉中尚無留言

規則

二元樹排序(Binary Sort)又有人稱為黑紅樹, 它是所有高科技的開端, 沒有這個演算法, 就不會有現今這個世界. 其規則如下
1. 左邊小, 右邊大
2. 左中右, 中間取值

架構圖

binarytree

程式架構

下面的代碼, 依序執行如下動作

1. 產生n 個元素的陣列
2. 將亂數填入陣列中
3. 將陣列列印出來
4. 建立二元樹
5. 排序
6. 列印排序後的陣印

package binarytree;
public class BinaryTree {
    static int[]array;
    static int index=0;
    public static void main(String[] args) {
        //產生陣列並填入亂數
        int n=10;
        array=new int[n];
        for (int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*10000);
        }
        
        //列印未排序的陣列
        printData(array);
        
        //建立二元樹
        Node root=null;
        for (int i=0;i<array.length;i++){
            root=bt(root, array[i]);
        }
        
        //排序
        sort(root);
        
        //列印排完序後的陣列
        printData(array);
    }
    public static void printData(int[] array){
        //todo
    }

    //bt : buildTree的縮寫
    public static Node bt(Node node, int value){
        //todo
    }
    public static void sort(Node node){
        //todo
    }
}

//節點資料結構
class Node{
    Node left;
    Node right;
    int value;
    public Node(int value){
        this.value=value;
    }
}

完整代碼

package binarytree;
public class BinaryTree {
    static int[]array;
    static int index=0;
    public static void main(String[] args) {
        /*
        1. n=10;
        2. 產生陣列 array
        3. 填入亂數
        4. 列印
        5. 建立二元樹
        6. 排序
        7. 列印
        */
                
        int n=10;
        array=new int[n];
        for (int i=0;i<array.length;i++){
            array[i]=(int)(Math.random()*10000);
        }
        printData(array);
        Node root=null;
        for (int i=0;i<array.length;i++){
            root=bt(root, array[i]);
        }
        sort(root);
        printData(array);
    }
    public static void printData(int[] array){
        for (int i=0;i<array.length;i++){
            System.out.printf("%d ", array[i]);
        }
        System.out.println();
    }
    public static Node bt(Node node, int value){
        //進入點沒東西, 就產生節點
        if (node==null)node=new Node(value);
        //否則就判斷是往左邊走, 或往右邊走
        else if (value<node.value)node.left=bt(node.left, value);
        else node.right=bt(node.right, value);
        return node;
    }
    public static void sort(Node node){
        //左中右, 中間取值
        
        //底下為往左邊走
        if (node.left!=null)sort(node.left);
        
        //中間取值
        array[index++]=node.value;
        
        //接下來, 往右邊走
        if (node.right!=null)sort(node.right);
    }
}
class Node{
    Node left;
    Node right;
    int value;
    public Node(int value){
        this.value=value;
    }
}

結果 : 
29 154 252 349 411 447 462 543 734 982

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *