使用中序遍历从相同大小的已排序数组填充现有 BST
Fill an existing BST from sorted array of same size using inorder traversal
如果我有 int
大小 n
的 BST 树和 int
大小 n
的排序数组(不同值),我想填充带有数组元素的树——我应该通过树的中序遍历来做到这一点,这样 arr[0]
就会在最左边的节点中,而 arr[n-1]
就会在最右边的节点中。 (所以需要 O(n)
时间)
我试图编写一个简单的递归函数来执行此操作,但它不起作用。似乎应该做一些事情来保存数组中的当前索引。
void insert(Node* v, int* arr) {
if (!v) {
return;
}
insert(v->left, arr);
v->key = a[0];
insert(v->right, arr + 1);
}
我该如何更改?
你的决定几乎是正确的。只需将函数声明更改为:
void insert(Node* v, int* &arr)
并且当您访问右子树时,您应该以下一种方式传递数组的下一个元素:
insert(v->right, ++arr);
arr
必须作为参考 &
。在您的情况下,这与将指针副本传递给数组有关。当从子节点到父节点return时,指针重新指向初始数组arr
的第一个元素。
您可以使用指向数组的指针的指针获得类似的行为,同时对代码进行微小的更改。
如果我有 int
大小 n
的 BST 树和 int
大小 n
的排序数组(不同值),我想填充带有数组元素的树——我应该通过树的中序遍历来做到这一点,这样 arr[0]
就会在最左边的节点中,而 arr[n-1]
就会在最右边的节点中。 (所以需要 O(n)
时间)
我试图编写一个简单的递归函数来执行此操作,但它不起作用。似乎应该做一些事情来保存数组中的当前索引。
void insert(Node* v, int* arr) {
if (!v) {
return;
}
insert(v->left, arr);
v->key = a[0];
insert(v->right, arr + 1);
}
我该如何更改?
你的决定几乎是正确的。只需将函数声明更改为:
void insert(Node* v, int* &arr)
并且当您访问右子树时,您应该以下一种方式传递数组的下一个元素:
insert(v->right, ++arr);
arr
必须作为参考 &
。在您的情况下,这与将指针副本传递给数组有关。当从子节点到父节点return时,指针重新指向初始数组arr
的第一个元素。
您可以使用指向数组的指针的指针获得类似的行为,同时对代码进行微小的更改。