预订数组的二进制搜索树

时间:2015-10-26 12:20:03

标签: c++ binary-search-tree

我正在尝试一个标准的面试问题 - 从预订数组重构二进制搜索树。 这是我的代码

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))

任何帮助表示感谢。

2 个答案:

答案 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]);

如果树不是二叉搜索树,则无法从其键的前序遍历重建。但是,您可以从内容键和外部节点的前序遍历重建。外部节点可以看作空指针。有点复杂但可能。如果您有兴趣,请告诉我并解释一下。

祝你好运!