【问题标题】:unsorted Array to Binary Search Tree未排序的数组到二叉搜索树
【发布时间】:2018-10-20 06:04:04
【问题描述】:

所以我确信这非常简单,我只是想念它,但我需要为 BST 创建一个未排序的数组。我有一个数组 int [] data = { 50, 30, 60, 10, 80, 55, 40 };并且无论我将其更改为什么,我都需要将其转换为以第一个数字为根的不平衡BST,其他数字遵循左右规则。我有这段代码适用于这个数组,但如果我将数字更改为不在中间的数字,则不会。

 public Node arraytoBinary(int [] array, int start, int end) {
    if (start > end){
        return null;
    }
    int mid = (start + end) / 2;
    Node node = new Node(array[mid]);
   node.left = arraytoBinary(array, start, mid - 1);
   node.right = arraytoBinary(array, mid + 1, end);

    return node;
}    

【问题讨论】:

  • 您是否正在尝试制作平衡的 BST?如果是这样,这种方法需要对数组进行排序。如果不是,为什么不遍历数组并按顺序添加到树中?
  • @kingkupps 如果您将数组元素插入到 bst 中,它不必是排序数组,但数组必须排序以 执行 对数组进行二分搜索。实际上,如果它是有序的,并且您按顺序插入它们,则 bst 将转移到一个列表中。平衡数组也不需要排序数组;平衡处理我上面提到的问题。
  • “我有这个代码适用于这个数组,但如果我将数字更改为不在中间的数字,则不能。”你能用一个例子来澄清一下吗?
  • @ChiefTwoPencils 是的,但是对于要生成平衡 BST 的此代码,必须对数组进行排序。否则不能保证生成的树是平衡的。平衡数组是什么意思?
  • @ChiefTwoPencils Ahh 明白我误读了这个问题。

标签: java arrays binary-search-tree


【解决方案1】:

我真的不明白您为什么要尝试拆分数组,看起来您正在对值及其顺序做出一些假设。 (虽然老实说我没有运行你的代码)你不能把你要去的方向(左,右)想当然。它取决于当前元素的值和当前节点持有的值。

我的方法是定义一个insert(Node node, int value) 方法并让arrayToBinary 简单地迭代数组并调用insert。这将为您提供具有最小界面的干净树。另外,它基于 BST 的定义和插入逻辑,因此应该很直观。

(取悦您的伪)
插入


Node insert(node, value)
    if node is null
        // Create a leaf.
        // It might be the root...
        return new Node(value)

    // It's occupied, see which way to
    // go based on its value

    // right? ...
    if value > node.value
        node.right = insert(node.right, value)

    // or left?
    else if value < node.value
        node.left = insert(node.left, value)

    // Code is not handling dups.
    return node

转化率


Node arrayToBinary(array, root)
    for e in array
        root = insert(root, e)
    return root

这会将第一个元素保留为根,并将按预期插入数组的其余部分。

【讨论】:

  • 这就是你的意思吗?
  • 私有节点 insertNode(Node currentParent, Node newNode) { if (currentParent == null) { return newNode; } else if (newNode.value > currentParent.value) { currentParent.right = insertNode(currentParent.right, newNode); } else if (newNode.value
  • @Alexisdiaz,它看起来不错,但很难像那样阅读。你试一试了吗?
  • 我只需要构建你提到的第二个是的,我试图让它读起来像代码,但由于某种原因它不会对我缩进
  • 对于 arraytoBinary,e 应该是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
相关资源
最近更新 更多