重複の可能性:
2 つのバイナリ ツリーをマージする方法
私は木のコードに不慣れで、関数を書いて 2 つの二分探索木をマージするコードを書くように頼まれました。
void mergeBst (BST & othertree)
この関数は別の Bst を受け取り、そのツリーからすべての非冗長値を現在のツリーに挿入します。その方法を教えてください。
重複の可能性:
2 つのバイナリ ツリーをマージする方法
私は木のコードに不慣れで、関数を書いて 2 つの二分探索木をマージするコードを書くように頼まれました。
void mergeBst (BST & othertree)
この関数は別の Bst を受け取り、そのツリーからすべての非冗長値を現在のツリーに挿入します。その方法を教えてください。
2 つのツリーを使用して 2 つのソート済みリストを作成します。これは O(m+n) になります。次に、2 つのソートされたリストを順序を維持してマージします。(O(m+n)) マージされたリストを使用して構成ツリーを作成します。(O(m+n))
または、単に入力ツリー内のすべてのノードについて、ノードをソース ツリーに挿入する位置を見つけます。それから挿入します。
ツリー B をツリー A にマージするには ( A.mergeBst(B)
):
B のルートを A のルートと比較します。B のルート
の方が大きい場合は、B.left
A にマージし、B の残りを にマージしA.right
ます。
少ない場合はB.right
A にマージし、残りの B を にマージしA.left
ます。
それらが等しい場合は、 、 にマージB.left
しA.left
、B のルートを破棄しB.right
ます。A.right
2 つの二分探索木を考える:
かなり単純なアルゴリズムがあります。
ソース検索の各「値」について、それらがターゲットにある場合はそれらを破棄し、そうでない場合は挿入します。
編集:「反復」とは、私が意味した:http://en.wikipedia.org/wiki/Tree_traversal
予約注文の反復: