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