Java 如何创建包含从1到n的所有数字的二进制搜索树
我正在尝试创建一个包含从1到n的所有数字的二进制搜索树。一个例子是从1到5 根:3 左:2 root.left.left=1 root.right=4 root.right.right=5 这棵树碰巧不是很平衡,但我更喜欢一种方法,它能产生尽可能平衡的树 我正试图为此创建自己的数据结构,因此我基本上只编写了一个节点类: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
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(idpublic 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)
。