Algorithm 实现这种二叉树的最佳方法是什么?

Algorithm 实现这种二叉树的最佳方法是什么?,algorithm,data-structures,binary-tree,Algorithm,Data Structures,Binary Tree,假设我有一棵高度为h的二叉树,它的元素是x1,x2。。。xn xi元素最初位于第i个最左边的叶子上。树应该在O(h)时间内支持以下方法 添加(i,j,k),其中1根据我对问题的理解,第十一个元素的位置永远不会改变,并且树不是搜索树,搜索仅基于节点的位置 可以在非叶顶点中存储偏移,指示其子体的值更改 添加(i,j,k)将从根开始,并在树中加深,当且仅当节点的所有子节点都在范围内时,才会将节点的值增加k。如果它增加了价值,就不会进一步深化。 注1:在单个add()操作中,您可能需要添加多个数字。 注

假设我有一棵高度为h的二叉树,它的元素是x1,x2。。。xn

xi元素最初位于第i个最左边的叶子上。树应该在O(h)时间内支持以下方法


  • 添加(i,j,k),其中1根据我对问题的理解,第十一个元素的位置永远不会改变,并且树不是搜索树,搜索仅基于节点的位置

    可以在非叶顶点中存储偏移,指示其子体的值更改

    添加(i,j,k)
    将从根开始,并在树中加深,当且仅当节点的所有子节点都在范围内时,才会将节点的值增加k。如果它增加了价值,就不会进一步深化。
    注1:在单个
    add()
    操作中,您可能需要添加多个数字。
    注2:实际上,您最多需要添加
    O(logn)=O(logh)
    值[说服自己为什么。提示:数字的二进制表示形式最多为
    n
    需要
    O(logn)
    位],这会让您[再次确保您理解为什么]所需的复杂性

    因此,
    get(i)
    非常简单:汇总从根到第i个叶的值,然后返回这个总和


    因为这看起来像是家庭作业,所以我不会发布伪代码,这条指导原则应该让您开始进行此分配。

    根据我的理解,第十一个元素的位置永远不会改变,并且树不是搜索树,搜索完全基于节点的位置

    可以在非叶顶点中存储偏移,指示其子体的值更改

    添加(i,j,k)
    将从根开始,并在树中加深,当且仅当节点的所有子节点都在范围内时,才会将节点的值增加k。如果它增加了价值,就不会进一步深化。
    注1:在单个
    add()
    操作中,您可能需要添加多个数字。
    注2:实际上,您最多需要添加
    O(logn)=O(logh)
    值[说服自己为什么。提示:数字的二进制表示形式最多为
    n
    需要
    O(logn)
    位],这会让您[再次确保您理解为什么]所需的复杂性

    因此,
    get(i)
    非常简单:汇总从根到第i个叶的值,然后返回这个总和


    因为这似乎是一个家庭作业,所以我不会发布伪代码,这条指导原则应该让你开始这个任务。

    这是一个家庭作业吗?如果是这样的话,你能在你的问题中添加标记作业吗?谢谢:)这是家庭作业吗?如果是这样的话,你能在你的问题中添加标记作业吗?谢谢:)在“将节点的值增加k,当且仅当…”部分中,您是否假设节点按顺序遍历?您正在增加非叶节点的值,您可以按自己的意愿遍历它,顺序只是一种可能性,并且在任何情况下,您不需要遍历超过
    2*h
    的顶点,实际上,我需要为每个内部节点存储最多O(1)个空间。我知道Knuth有一个聪明的算法,用O(nlogn)时间在O(1)辅助空间中迭代二叉树:所以我正在考虑将这个解决方案转换为我的,但不知道如何。。也许暂时从某些叶子中添加回引用可以做到这一点,因为add()操作不会返回任何结果。。它只是帮助我回答get(i)操作。您需要
    O(1)
    每个内部节点的空间,只是每个节点的偏移值。此外,您可以确保算法在
    O(1)
    空间中运行,如果您向每个顶点添加额外的“父”节点,如果没有它,递归将导致
    O(h)
    总空间,这对于节点来说是平均
    O(1)
    ,因为
    h amit,您错过了我评论的要点。Re“当且仅当一个节点的所有子节点都在[i,j]范围内时,将该节点的值增加k”-在顺序遍历中,如果一个节点的所有子节点都在该范围内,则该节点也在该范围内。在前序或后序遍历中,当所有节点的子节点都在范围内时,节点本身可能在范围内,也可能不在范围内。在“将节点的值增加k,当且仅当…”部分中,您是否假设节点按顺序遍历?您是在增加非叶节点的值,您可以按照自己的意愿进行遍历,inorder只是一种可能性,在任何情况下,都不需要遍历超过
    2*h
    的顶点,最多两片叶子。实际上,我需要为每个内部节点存储最多O(1)个空间。我知道Knuth有一个聪明的算法,用O(nlogn)时间在O(1)辅助空间中迭代二叉树:所以我正在考虑将这个解决方案转换为我的,但不知道如何。。也许暂时从某些叶子中添加回引用可以做到这一点,因为add()操作不会返回任何结果。。它只是帮助我回答get(i)操作。您需要
    O(1)
    每个内部节点的空间,只是每个节点的偏移值。此外,您可以确保算法在
    O(1)
    空间中运行,如果您向每个顶点添加额外的“父”节点,如果没有它,递归将导致
    O(h)
    总空间,这对于节点来说是平均
    O(1)
    ,因为
    h amit,您错过了我评论的要点。Re“当且仅当一个节点的所有子节点都在[i,j]范围内时,将该节点的值增加k”-在顺序遍历中,如果一个节点的所有子节点都在该范围内,则该节点也在该范围内。在前序或后序遍历中,当所有节点的子体都在范围内时,节点本身可能在范围内,也可能不在范围内。