从数组创建BST

时间:2011-03-24 01:20:10

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

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

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

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

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

  • 然后,我将A [1] -A [2] + A [3]插入子树2(子树5)和A [1] -A [2] -A [3]的左子树中子树2的右子树(子树6)。

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

所以,基本上,数组的第一个元素成为树的根,然后我向下移动:每个左子树都有值,它的父级加上数组的下一个元素,每个右子树都有值它的父元素和数组中下一个元素的区别。

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

环顾其他问题和讨论我理解有一个政策反对提出整体解决方案,所以我想明确表示我不是要求解决方案,而是要求它提供指导。如果有人想看看,我可以告诉你我已经做过的事情。

1 个答案:

答案 0 :(得分:0)

进行递归的方法是始终假设您已经掌握了一个有效的函数。那么让我们看看[使用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,创建第一个节点等等