【问题标题】:Recursive minimal tree creating function buggy?递归最小树创建功能错误?
【发布时间】:2019-02-01 08:24:48
【问题描述】:

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

算法结构为:

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

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

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

  4. 递归。

但我认为实际代码有问题。给定一个包含 {6, 7, 8, 9, 10} 的数组,它将两次插入 6 到左子树中。这是因为 int mid = (start + end) / 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;
}

【问题讨论】:

  • 7 将插入到 6 的右侧
  • 你的问题是什么?

标签: java recursion binary-search-tree


【解决方案1】:

算法或代码逻辑没有问题。 下面是按照代码插入后二叉搜索树的样子。

  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

【讨论】:

  • 但是由于 mid 随每次递归调用而递减,例如当 start = 0 和 end = 4 时,mid 变为 2。您插入根节点,即 8。然后您递归:start = 0并且 end = mid - 1 = 1. mid 变为 0。您将 6 作为 8 的左孩子插入。但是当您再次递归时,start = 0 和 end = mid - 1 = 0. mid 变为 0。您将 6 重新插入树中再次......这是我感到困惑的地方。没有bug吗?
  • 对不起!你是对的,但我看不到它,因为我在代码之后犯了非常简单的愚蠢错误......我得到了隧道视觉!看不到我做错了什么。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2011-05-08
  • 2015-03-18
相关资源
最近更新 更多