我正在尝试一个标准的面试问题 - 从预订数组重构二进制搜索树。 这是我的代码
class bst{
node* root
public:
static node* bstFromPreOrderUtil(int* arr, int* index, int key, int min, int max, int size){
if(*index >= size) return nullptr;
node* r = nullptr;
if(key> min && key < max){
r = new node(key);
*index = *index + 1;
}
if(*index < size){
r->left = bstFromPreOrderUtil(arr, index, arr[*index], min, key, size);
r->right = bstFromPreOrderUtil(arr, index, arr[*index], key, max, size);
}
return r;
}
static node* bstFromPreOrder(int* arr, int size){
int index=0;
return bstFromPreOrderUtil(arr, &index, arr[0], INT_MIN, INT_MAX, size);
}
};
struct node的定义在这里
struct node{
node():data(0), left(nullptr), right(nullptr){}
node(int data):data(data), left(nullptr), right(nullptr){}
int data;
node* left;
node* right;
};
这是我的主叫代码,
int arr[] = {15, 13, 3, 11, 21, 19, 29};
node* root = bst::bstFromPreOrder(arr, 7);
我在函数进行递归调用
时不断收到以下错误EXC_BAD_ACCESS (code=2, address=0x7fff5ab9cff8))
任何帮助表示感谢。
答案 0 :(得分:1)
移动
if(*index < size){
r->left = bstFromPreOrderUtil(arr, index, arr[*index], min, key, size);
r->right = bstFromPreOrderUtil(arr, index, arr[*index], key, max, size);
}
在第一个if
块内。
您必须正确复制粘贴; - )
答案 1 :(得分:0)
答案取决于二叉树的类型。
如果它是关于经典构建的二叉搜索树,那么扫描数组并在二叉树中插入每个键就可以构建原始树。
您可以使用例程进行插入,例如:
Node * insert_in_bst(Node *& r, int key)
{
if (r == nullptr) // an empty tre reached?
{
r = new Node;
r->key = key;
return r;
}
if (key < r->key)
return insert_in_bst(r->left, key);
else
return insert_in_bst(r->right, key);
}
如您所见,此算法仅通过用新节点替换空指针来修改树;树的其余部分保持相同的形状。作为练习,使用此算法构建一些随机树,进行前序遍历并验证每个遍历是否与插入的确切顺序相对应。
之后,您扫描预订单数组arr
:
Node root = nullptr; // tree is originally empty
for (int i = 0; i < n; i++)
insert_in_bst(r, arr[i]);
如果树不是二叉搜索树,则无法从其键的前序遍历重建。但是,您可以从内容键和外部节点的前序遍历重建。外部节点可以看作空指针。有点复杂但可能。如果您有兴趣,请告诉我并解释一下。
祝你好运!