Java 如何创建包含从1到n的所有数字的二进制搜索树

Java 如何创建包含从1到n的所有数字的二进制搜索树,java,algorithm,tree,binary-search-tree,Java,Algorithm,Tree,Binary Search Tree,我正在尝试创建一个包含从1到n的所有数字的二进制搜索树。一个例子是从1到5 根:3 左:2 root.left.left=1 root.right=4 root.right.right=5 这棵树碰巧不是很平衡,但我更喜欢一种方法,它能产生尽可能平衡的树 我正试图为此创建自己的数据结构,因此我基本上只编写了一个节点类: private class BinaryNode{ int data; BinaryNode left; BinaryNo

我正在尝试创建一个包含从1到n的所有数字的二进制搜索树。一个例子是从1到5

根:3

左:2

root.left.left=1

root.right=4

root.right.right=5

这棵树碰巧不是很平衡,但我更喜欢一种方法,它能产生尽可能平衡的树

我正试图为此创建自己的数据结构,因此我基本上只编写了一个节点类:

    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的连续整数)是无用的:您可以简单地使用数组,并使用数组索引“搜索”它。

根节点上的数据将是
(n+1)/2
;如果有一个子树表示范围
[i..j]
,则该子树的根是
(i+j)/2
(使用整数算术)

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;
            }
        }
    }
}
您可以使用该事实递归地构建树:

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){
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;
            }
        }
    }
}
Node newNode=新节点(id); if(root==null){ 根=新节点; 返回; } 节点电流=根; 节点父节点=null; while(true){ 父项=当前; if(id
public void插入(int-id){
Node newNode=新节点(id);
if(root==null){
根=新节点;
返回;
}
节点电流=根;
节点父节点=null;
while(true){
父项=当前;

如果(I您需要在BinaryNode类中使用balanceFactor变量,以便在运行过程中平衡树。无论如何,如果您希望在运行过程中平衡树,为什么不尝试实现AVL树而不是二进制搜索树?我正在考虑使用AVL,但我想我会先尝试此方法哦,好的,我明白了。您需要一个平衡事实在BinaryNode类中使用r变量,这样您就可以在运行过程中平衡树。无论如何,如果您想在运行过程中平衡树,为什么不尝试实现AVL树而不是二进制搜索树?我正在考虑使用AVL,但我想我会先尝试一下。哦,好的,我明白了。如果不太复杂,您可以演示如何制作平衡树吗ced二叉树从随机数的排序数组开始。几乎完全相同:
i
j
成为数组索引的范围;只需将数组作为附加参数传递给
build
,并使用
node.data=arr[mid];
。此外,还需要使用
build(arr,0,arr.length-1)启动递归
。这个解决方案的复杂性是什么?@GrzegorzGórkiewicz O(n)。它为范围内的每个元素恰好创建了一个节点。更正式地说,这似乎也遵循了主定理:
T(n)=2*T(n/2)+const
,所以θ中的
T(n)=θ(n^(logu 2))=θ(n^1)=θ(n)
。如果不太复杂,您可以演示如何从随机数的排序数组开始创建平衡二叉树。几乎完全相同:
i
j
成为数组索引的范围;只需将数组作为附加参数传递给
build
,然后使用
node.data=arr[mid]
。此外,您需要使用
build(arr,0,arr.length-1)
开始递归。这个解决方案的
O(?)
复杂性是什么?@GrzegorzGórkiewicz O(n)。它为范围内的每个元素恰好创建一个节点。更正式地说,这似乎也遵循主定理:
T(n)=2*T(n/2)+const
,所以
T(n)\in Theta(n^(log_2))=Theta(n^1)=Theta(n)