簡體   English   中英

在添加到二叉搜索樹Java之前對數組進行排序

[英]sort Array before adding to a Binary Search tree Java

我有一個按AZ順序排列的字符串數組。 我想知道對平衡的二進制搜索樹進行排序的最佳方法。 我最初的想法是將數組分成上半部分和下半部分,然后分別對它們進行排序。

我是否應該能夠使用遞歸方法將其分成兩半以獲得樹的下一個節點? 我只是現在無法解決這個問題,以為我會問是否有人有任何想法。 引導我朝正確的方向或提供一些示例。 謝謝!

我正在使用自己的BinaryTree類和BinaryTreeNode類。 編輯:

public class BinaryTree {
private BinaryTreeNode root;

public void insert(String text) {

root = insertNode(root, text); 

}

private BinaryTreeNode insertNode(BinaryTreeNode curNode, String text) {
if (curNode == null) {
    BinaryTreeNode newNode = new BinaryTreeNode(text);
    //newNode.value = text;
    return newNode;
} else {
    if (text.compareTo(curNode.value) < 0 ) {
        //left child
        //use of recursion to properly place Node
        curNode.left = insertNode(curNode.left, text);
        return curNode;
    }

        else {

        //right
        //use of recursion to properly place Node
        curNode.right = insertNode(curNode.right, text);
        return curNode;
    }
}

}

public BinaryTreeNode getRoot() {
return root;
}

 public void setRoot(BinaryTreeNode root) {
this.root = root;
 }
 }

是否將其視為自平衡二進制搜索樹?

您的樹似乎沒有自我平衡。 自平衡BST在插入后或多次插入后將采取步驟,以確保(大致)平衡。

如果僅添加一次元素並將樹僅用於讀取,則將擁有已排序的數組,然后按以下步驟操作:在中間選擇元素。 創建一個以它為鍵的根,然后以遞歸方式將其左側的元素(較小的元素)添加為根的左側子樹,並將其右側的元素分別添加為右側子樹。 您最終應該獲得一個或多或少平衡的BST。 示例代碼:

public class BinaryTree {

    /* ... */


    //each recursive call receives a pair of bounds for the part of the 
    //array it has to process: left and right
    public static BinaryTreeNode nodeFromSortedArray(String[]a,
                                           int left, int right){

        if (right<left) return null;

        if (right==left)
            return new BinaryTreeNode(a[left]);

        int mid = (left+right)/2;

        //create node from middle element
        BinaryTreeNode n = new BinaryTreeNode(a[mid]);

        //recursively add elements to the left as its right subtree
        n.left = nodeFromSortedArray(a, left, mid-1);

        //recursively add elements to the right as its right subtree
        n.right = nodeFromSortedArray(a, mid+1, right);

        return n;
    }

    public static BinaryTree fromSortedArray(String[]a){
        BinaryTree bt = new BinaryTree();
        bt.setRoot(nodeFromSortedArray(a,0,a.length-1));
        return bt;
    }

    /* ... */
}

但是,在這種情況下,您可以簡單地將元素保留在已排序的數組中,並使用二進制搜索來索引它,而不是樹。 復雜度應該是相同的,O(logn),但是您需要更少的引用來存儲整個內容,並且緩存性能應該更好。

如果您需要一棵可變樹並想使其高效,則可能需要使其自平衡,在這種情況下,向其中添加元素的順序無關緊要。

如果您具有自平衡的二進制搜索樹,則對數組進行預排序很可能適得其反。 用於將排序數據最佳地添加到平衡樹的算法與用於添加無序數據的算法完全不同。

但是,您發布的代碼沒有任何“自我平衡”。 它只是普通的二叉樹插入算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM