摘自《破解编码面试》的练习: 给定一个具有唯一整数元素的排序(递增顺序)数组,编写一种算法,该算法将创建具有最小高度的二进制搜索树。
算法结构为:
将数组的中间元素(是根)插入树中。
将左子数组元素插入(插入到左子树中)。
将右子数组元素插入(插入右子树中)。
递归。
但是我认为实际的代码有问题。给定一个包含{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;
}
答案 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