递归最小树创建功能越野车?

时间:2018-08-26 17:01:47

标签: java recursion binary-search-tree

摘自《破解编码面试》的练习: 给定一个具有唯一整数元素的排序(递增顺序)数组,编写一种算法,该算法将创建具有最小高度的二进制搜索树。

算法结构为:

  1. 将数组的中间元素(是根)插入树中。

  2. 将左子数组元素插入(插入到左子树中)。

  3. 将右子数组元素插入(插入右子树中)。

  4. 递归。

但是我认为实际的代码有问题。给定一个包含{6,7,8,9,10}的数组,它将把6两次插入到左子树中。这是因为int mid =(开始+结束)/ 2;该代码绝不会将节点7插入左子树中,因为它位于索引1处,并且mid变量的值不会为1。

Node createMinimalBST(int arr[]) {
 return createMinimalBST(array, 0, array.length - 1);
}

Node createMinimalBST(int arr[], int start, int end) {
 if (end < start) {
  return null;
 }

 int mid = (start + end) / 2;
 Node n = new Node(arr[mid]);
 n.left = createMinimalBST(arr, start, mid - 1);
 n.right = createMinimalBST(arr, mid + 1, end);
 return n;
}

1 个答案:

答案 0 :(得分:0)

算法或代码逻辑没有错。 以下是根据代码插入后的二进制搜索树的确切样子。

  8
 / \
6   9
 \   \
 7   10

逻辑工作代码:

#include <iostream>
using namespace std;

typedef struct node {
    int val;
    node *left, *right;
    node(int value){
        val = value;
        left = right = NULL;
    }
}Node;

Node* createMinimalBST(int arr[], int start, int end) {
    if (end < start)
        return NULL;

    int mid = (start + end) / 2;
    Node *n = new Node(arr[mid]);
    n->left = createMinimalBST(arr, start, mid - 1);
    n->right = createMinimalBST(arr, mid + 1, end);
    return n;
}

Node* createMinimalBST(int arr[], int size) {
    return createMinimalBST(arr, 0, size - 1);
}

int main() {

    int a[] = {6, 7, 8, 9, 10};
    Node *root = createMinimalBST(a, 5);

    cout << root->val << endl;
    cout << root->left->val << endl;
    cout << root->right->val << endl;
    cout << root->left->right->val << endl;
    cout << root->right->right->val << endl;

    return 0;
}

代码输出:

8
6
9
7
10