【问题标题】:Creating a BST from an array从数组创建 BST
【发布时间】:2011-07-21 18:48:24
【问题描述】:

我需要用以下(奇怪的)方式创建一个二叉搜索树:

我得到一个数组 (A[n])。 A[1] 成为树的根。

  • 然后,我将 A[1]+A[2] 插入到根的左子树(subtree1,下面使用),同时将 A[1]-A[2] 插入到右子树(subtree2 ) 的根。

  • 我将 A[1]+A[2]+A[3] 插入到 subtree1(subtree3)的左子树和 A[1]+A[2]-A[3] 到右子树子树 1(子树 4)。

  • 然后,我将 A[1]-A[2]+A[3] 插入到 subtree2 (subtree5) 的左子树和 A[1]-A[2]-A[3] 到subtree2(subtree6)的右子树。

  • 重复 subtree3、subtree4、subtree5、subtree6,直到到达数组的末尾。

所以,基本上,数组的第一个元素成为树的根,然后我向下移动:每个左子树的值都是其父元素加上数组的下一个元素的总和,每个右子树都有值其父元素与数组中下一个元素的差异。

我知道我需要使用递归的概念,但要以一种修改的方式。在这里输入我的问题并试图向除了我的大脑之外的其他人解释它实际上使我形成它的方式给了我一些尝试的想法但我可以看到我正在处理的问题是一个常见的问题所以也许你可以给我有一些关于如何使用递归来构建树的建议。

环顾其他问题和讨论,我知道有一项反对提出完整解决方案的政策,所以我想明确表示我不是在寻求解决方案,而是寻求指导。如果有人想看看,我可以向您展示我已经完成的工作。

【问题讨论】:

    标签: recursion binary-tree parent-child binary-search-tree subtree


    【解决方案1】:

    进行递归的方法是始终假设您已经拥有一个工作函数。那么让我们看看[使用Java语法]...

    Tree buildTree(int currentSum, int[] array, int index, boolean sign);
    

    假设可行。那么你需要在索引 i 处构建一棵树吗?

    // current value to look at at this level
    int curValue = array[index];
    // depending on sign, it may be negative
    if (!sign) { 
      curValue *= -1;
    }
    // add it to the running total
    int nodeValue = currentSum + curValue;
    Node nd = new Node(nodeValue);
    
    nd.left = buildTree(nodeValue, array, index + 1, true);
    nd.right = buildTree(nodeValue, array, index + 1, false);
    

    基本上就是这样。您需要处理边缘情况:index = array.length、创建第一个节点等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多