所以我确信这非常简单,我只是错过了它,但我需要为BST制作一个未排序的数组。我有一个数组int [] data = {50,30,60,10,80,55,40};我需要把它转换成一个不平衡的BST,第一个数字作为根,不管我把它改成什么,其他数字遵循左右规则。我有这个代码适用于这个数组但不是如果我把数字改为不在中间的东西。
public Node arraytoBinary(int [] array, int start, int end) {
if (start > end){
return null;
}
int mid = (start + end) / 2;
Node node = new Node(array[mid]);
node.left = arraytoBinary(array, start, mid - 1);
node.right = arraytoBinary(array, mid + 1, end);
return node;
}
答案 0 :(得分:0)
我真的不明白为什么你试图拆分数组,看起来你正在对值及其顺序做出一些假设。 (虽然老实说我还没有运行你的代码)你不能理所当然地认为你将要去的方向(左,右)。它取决于当前元素的值和当前节点保存的值。
我的方法是定义insert(Node node, int value)
方法,让arrayToBinary
简单地迭代数组并调用insert
。这将为您提供一个具有最小界面的干净树。另外,它基于BST的定义和插入逻辑,因此它应该是直观的。
(伪随意)
插入强>
Node insert(node, value)
if node is null
// Create a leaf.
// It might be the root...
return new Node(value)
// It's occupied, see which way to
// go based on it's value
// right? ...
if value > node.value
node.right = insert(node.right, value)
// or left?
else if value < node.value
node.left = insert(node.left, value)
// Code is not handling dups.
return node
<强>转换强>
Node arrayToBinary(array, root)
for e in array
root = insert(root, e)
return root
这会将第一个元素保留为根,并按预期插入数组的其余部分。