簡體   English   中英

如何創建一個二進制搜索樹,其中包括從1到n的所有數字

[英]How to create a binary search tree that includes all numbers from 1 to n

我正在嘗試創建一個二進制搜索樹,其中包括從1到n的所有數字。 一個例子是從1到5會像

根數:3

root.left:2

root.left.left = 1

root.right = 4

root.right.right = 5

這棵樹碰巧不是很平衡,但是我更喜歡一種能產生盡可能平衡的樹的方法。

我正在嘗試為此創建自己的數據結構,因此我基本上只是編寫了一個Node類:

    private class BinaryNode{
        int data;
        BinaryNode left;
        BinaryNode right;
        BinaryNode parent;
    }

而且我計划在另一個類中包含該樹本身。 我一直在尋找一個合適的方法來確定樹的左/右值,任何幫助表示贊賞!

根節點上的數據為(n+1)/2 如果您有一個表示范圍[i..j]的子樹,則該子樹的根為(i+j)/2 (使用整數算術)。

您可以使用以下事實遞歸構建樹:

static BinaryNode build(int i, int j) {
    if (i > j) return null;

    int mid = (i + j) / 2;  // Assumes i >= 0.

    BinaryNode node = new BinaryNode();
    node.data = mid;

    node.left = build(i, mid - 1);
    if (node.left != null) node.left.parent = node;

    node.right = build(mid + 1, j);
    if (node.right != null) node.right.parent = node;

    return node;
}

然后開始遞歸調用:

BinaryNode node = build(1, n);

但是,必須指出的是,這樣的二進制搜索樹(將連續的整數從1到n存儲)是沒有用的:您也可以簡單地使用數組,然后使用數組索引“搜索”它。

public void insert(int id){
    Node newNode = new Node(id);
    if(root==null){
        root = newNode;
        return;
    }
    Node current = root;
    Node parent = null;
    while(true){
        parent = current;
        if(id<current.data){                
            current = current.left;
            if(current==null){
                parent.left = newNode;
                newNode.parent = parent;
                return;
            }
        }else{
            current = current.right;
            if(current==null){
                parent.right = newNode;
                newNode.parent = parent;
                return;
            }
        }
    }
}

不進行遞歸插入1到n個數字。

public static void main(String arg[]){
    Solution2 s = new Solution2();
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for(int i = 1;i <= n;i++){
        s.insert(i);
    }

}

暫無
暫無

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

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