プレオーダー、インオーダー、ポストオーダーのトラバーサルを知っています。BST を再構築するアルゴリズムは何ですか?
4 に答える
BSTなので、または<1>in-order
からソートできます。実際には、またはのみが必要です....pre-order
post-order
pre-order
post-order
<1>比較関数が何であるかを知っている場合
pre-order
とからin-order
、二分木を構築する
BT createBT(int* preOrder, int* inOrder, int len)
{
int i;
BT tree;
if(len <= 0)
return NULL;
tree = new BTNode;
t->data = *preOrder;
for(i = 0; i < len; i++)
if(*(inOrder + i) == *preOrder)
break;
tree->left = createBT(preOrder + 1, inOrder, i);
tree->right = createBT(preOrder + i + 1, inOrder + i + 1, len - i - 1);
return tree;
}
この背後にある理論的根拠:
予約注文では、最初のノードがルートです。順序でルートを見つけます。すると、木を左右に分けることができます。再帰的に実行します。
post-order
と についても同様ですin-order
。
二分木の再構築には、preorder+inorder または postorder+inorder が必要です。BST について既に指摘したように、事前注文または事後注文のいずれかを使用して再構築することができます。
@brainydexter によって与えられたコードを変更した次の関数を使用して、静的変数を使用せずにツリーを再構築できます。
struct node* buildTree(char in[],char pre[], int inStrt, int inEnd,int preIndex){
// start index > end index..base condition return NULL.
if(inStrt > inEnd)
return NULL;
// build the current node with the data at pre[preIndex].
struct node *tNode = newNode(pre[preIndex]);
// if all nodes are constructed return.
if(inStrt == inEnd)
return tNode;
// Else find the index of this node in Inorder traversal
int inIndex = search(in, inStrt, inEnd, tNode->data);
// Using index in Inorder traversal, construct left and right subtress
tNode->left = buildTree(in, pre, inStrt, inIndex-1,preIndex+1);
tNode->right = buildTree(in, pre, inIndex+1, inEnd,preIndex+inIndex+1);
return tNode;
}
私は個人的にダンテの答えを理解するのが少し難しいと感じました。私は解決策を試してみましたが、ここに投稿されたものと似ていることがわかりましたhttp://geeksforgeeks.org/?p=6633
複雑さは O(N^2) です。
ポストオーダー トラバーサルを使用してツリーを構築するための別のアプローチを次に示します。
お役に立てれば