、BはAVL木の多くの要素があるかを決定する特定の上限という機能を設計してみましょう少ないときB:
count(node, b)
if node.key < b:
return node.left.size + 1 + count(node.right, b)
else
return count(node.left, b)
ありますが、一つだけ再帰呼び出し各分岐においてノードの深さが増加する。したがって、この関数の複雑さはO(log(n))です。この機能も、各再帰呼び出しで増加node1
については
kth(k, node1, tree2)
left = node1.left.size + count(tree2, node1.key)
if k < left:
return kth(k, node.left, node2.right
else if k == left:
return max(upperBound(tree2, node1.key), upperBound(node1.left, node1.key))
else if k == left + 1:
return node1.key
else
return kth(k - node1.left.size - 1, tree2)
ので、私たちは、それぞれが必要なO(ログをO(n個のログ)電話を持っている:
は、今、私たちはcount
を使用して必要な機能を構築することができますn)count
関数の呼び出しによる時間。稼働時間は、必要に応じてO(log²n)です。
この解決策を完了するには、サブツリー内の最大キーを返す関数upperBound
を設計する必要があります。これは、o(log n)時間で簡単に行うことができます。
私は、両方のツリーを結合したノードの数を「n」と推測していますか? –