[英]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.