二分探索木での順序通りの走査(VISIT LEFT、VISIT ROOT、VISIT RIGHT)により、ソートされた結果が得られることを知っています。しかし、バイナリツリーでポストオーダートラバーサル(VISIT LEFT、VISIT RIGHT、VISIT ROOT)を実行する必要があり、その結果、ソートされた値が得られるはずです。
それを達成するために、どのように二分木を構築する必要がありますか?
二分探索木での順序通りの走査(VISIT LEFT、VISIT ROOT、VISIT RIGHT)により、ソートされた結果が得られることを知っています。しかし、バイナリツリーでポストオーダートラバーサル(VISIT LEFT、VISIT RIGHT、VISIT ROOT)を実行する必要があり、その結果、ソートされた値が得られるはずです。
それを達成するために、どのように二分木を構築する必要がありますか?
ルートは最後にアクセスされるため、最大のアイテムが含まれている必要があります。左側のサブツリーは右側のサブツリーの前にアクセスされるため、左側のサブツリーのすべてのアイテムは、右側のサブツリーのどのアイテムよりも小さくなければなりません。
したがって、このようなツリーを構築するには、次のように進めることができます: ルートより大きいアイテムを挿入すると、そのアイテムが新しいルートになります。ルートより小さいが左サブツリーのルートより大きいアイテムを挿入する場合、それを右サブツリーに挿入します。それ以外の場合は、左のサブツリーに挿入します。
このサブルーチンは、ツリー構造が存在するツリーに挿入するためのものです。
struct tree
{
int data;
tree * left;
tree *right;
tree(int n) // constructor
{
data = n;
left = right = NULL;
}
};
アルゴリズムは次のとおり
です。1。ツリーが空の場合は、新しいノードを挿入します。
2.新しいノードのデータがルートノードのデータよりも大きい場合は、新しいノード
をツリーのルートにします。
3.それ以外の場合は、ツリーの左側のサブツリーに新しいノードを挿入します。
tree * insert(tree *root,int n)
{
if(root == NULL)
{
root = new tree(n);
return root;
}
else
{
if(n > root -> data)
{
tree * t = new tree(n);
t -> left = root;
return t;
}
else
{
root -> left = insert(root -> left,n);
return root;
}
}
}
ツリーの各ノードで次のことを確認する必要があります。
現在受け入れられている答えは、優れたオンラインアルゴリズムを提供します。やや簡単な解決策---オンラインではないため、不正行為の可能性があります---は、ソートされたリンクリストを親ポインタに格納することです。
言い換えると、データを並べ替えます。最大のアイテムをルートに配置し、そのサブツリーの1つを空にして、残りのn-1アイテムのポストオーダーソートされたツリーを他のサブツリーに再帰的に構築します。
ツリーの高さはnで、単一の葉がリストの先頭になり、ルートが最後尾の要素になります。葉から根までツリーを歩くと、要素は増加するシーケンスを形成し、このパスはポストオーダートラバーサルに正確に対応します。