【问题标题】:Get size of a binary tree in O(log n)在 O(log n) 中获取二叉树的大小
【发布时间】:2021-03-07 07:41:11
【问题描述】:

完整披露:这是家庭作业

我被要求在二叉树中返回排名,经过一些编码后,我得到了它的工作。 但是由于我的代码没有被接受,我注意到代码应该在O(log n)中运行

而减慢这一速度的罪魁祸首是我的尺寸方法:

public int size(Node node){
    if (node != null) return (size(node.left) + 1 + size(node.right));
    return 0;
}

我调用它是为了让所有元素的排名小于我需要查找的元素。

现在,我用谷歌搜索了所有内容,但显然不可能在 log n 时间内获得 BT 的大小?

那我需要怎么做呢?

【问题讨论】:

  • 你怎么可能用比项目数更少的步数来计算?这就像在说“以 1 为增量,以 50 步从 1 计数到 100”。
  • 普通的 BST 无法做到这一点。你想要的谷歌词是“订单统计树”
  • 嗯,我在讲座中从未听说过这个词。甚至练习也提到了二叉树。不过谢谢,我会调查的!
  • 这是一棵普通的二叉树吗?或者是否有一些您没有共享的节点排序,例如是BST吗?当你交替说“大小”和“等级”时,你到底要测量什么?
  • 我认为它是 BST,因为左 = 更小,右 = 更大。大小我的意思是叶子的数量。等级是 i。 e.如果我们有叶子 1、2 和 3,叶子 2 的等级将为 1(索引为 0)

标签: java data-structures time-complexity binary-tree big-o


【解决方案1】:

对于只存储子节点的简单二叉树,由于有 n 个节点,因此不可能在 O(log(n)) 时间内获得大小,并且您必须计算每个节点。但是,为什么要限制自己只生孩子呢?像许多数据结构一样,您可以使用节点存储大小:

class Node {
    public Node left;
    public Node right;
    public int value;
    private int size; // initialize this to 1
}

然后,在插入节点时,增加遇到的每个节点的大小:

public void insert(int value) {
    // increment the size
    this.size++;
    if (value < this.value) {
        // obviously check for null as well and insert as appropriate
        this.left.insert(value);
    } else {
        this.right.insert(value);
    }
}

现在,您可以在 O(1) 时间内获得大小,因为每个节点都有它。

【讨论】:

  • 哦,我一定会试试这个!我会告诉你的
  • 你做了一些假设。首先在你的例子中,二叉树是排序的——他从来没有说过。其次,插入总是发生在根节点。对于您的示例,如果插入发生在除根以外的任何节点上,则大小将被搞砸,因为父节点不会被更新。
  • 好的,这是正确的方法。他们希望我们扩充数据结构。我现在需要找到一种方法来实现这一点,谢谢
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多