假设我有一个高度为h的二叉树,其元素为x1,x2,... xn。
xi元素最初位于第i个最左边的叶子上。树应该在O(h)时间
中支持以下方法add(i,j,k)其中1< = i< = j =< ñ。该操作将值k添加到i和j之间的所有最左边节点的值。例如,添加(2,5,3)操作会增加所有最左边的节点,这些节点在第2和第5个节点之间为3。
get(i):返回最左边叶子的值。
该属性的内部节点应该存储什么?
注意:我不是在寻找一个确切的答案,但任何关于如何处理问题的提示都会很棒。
答案 0 :(得分:0)
据我所知,第x个元素的位置永远不会改变,而树不是搜索树,搜索仅基于节点
您可以在非叶子顶点中存储偏移量,指示其后代的值更改。
add(i,j,k)
将从根开始,并在树中加深,并且当且仅当其所有后代都在[i,j]
范围内时,将节点的值增加k。如果它增加了价值,就不会再进一步加深。
注1:在单个add()
操作中,您可能需要添加多个号码。
注2:您实际上需要添加最多O(logn) = O(logh)
个值[说服自己原因。提示:最多为n
的二进制数字表示需要O(logn)
位],稍后会[再次确保您理解为什么] O(logh)
需要复杂性。
get(i)
然后是微不足道的:总结从根到第i叶的值,并返回此总和。
由于它似乎是家庭作业,我不会发布伪代码,这个指南应该让你开始使用这个分配。