バイナリ復興と行きがけを使用して注文トラバーサル
序文
私は、このようなAの問題が発生し、現在のバイナリツリーにこの情報を再構築する方法を、バイナリツリーの前トラバーサルおよびポストオーダートラバースを知っています。
一見少しは非常に簡単、実際には、慎重な分析に出したデータを知って、推定無知ビット。
アルゴリズムの考え方
以下のデータがあります。
先行順走査:32154879
前順:12345789
私たちの法の先行順走査によると知って、最初のデータの先行順走査はOK、我々はデータの最初のビットをマークし、データのルートノードであります:
先行順走査:[3] 2154879
プレオーダー:1 2 [3] 45789
法律によると、その後トラバース我々は(前、中および順番を横断した後は同じです)、私たちは知っているトラバースは、常に第一の出力は、右部分木を部分木を残し、その後、出力、(前、中および後にのみ、ルートの位置データを異なります)。だから、順トラバーサルで、ルートノードデータは右、右部分木のデータで、左部分木の左にバインドされたデータです。この時点から、我々はルート、左部分木と右のサブツリーにデータを置くことができます。
行きがけの前にルート:3行きがけ:3
フロント左部分木の順序トラバーサル:21行きがけ:12
前右部分木の前順:54879前順:45789
OK、この後の時点に、賢明な友人が、その後行う方法を知っている必要があります。すべてのデータは、ルートノード、アルゴリズムの実行の終了を実行するまで左サブツリー及び右サブツリーを再帰的に、上記と同様の動作を行います。
コードの実装
//二叉树结构体
struct Tree {
int value;
Tree *left;
Tree *right;
};
//pre:前序遍历
//mid:中序遍历
//length:数组长度
Tree* Fun(const int *pre, const int *mid,const int length) {
//当空指针或者数组长度为0时返回
if (pre == NULL || mid == NULL || length <= 0)
return NULL;
//建立根节点
Tree *head = new Tree();
head->value=pre[0];
//找到中序遍历中根节点所在位置
int index = 0;
while (index<length) {
if (head->value == mid[index])
break;
++index;
}
//划分左子树
head->left = Fun(pre + 1, mid, index);
//划分右子树
head->right = Fun(pre + index +1, mid + index + 1, length - index - 1);
return head;
}
スプレッド
注文トラバーサルとどのようにプリオーダートラバーサル後に交換した場合?考え方は同じ、興味のある友人が自分で探索することができ、まだです。私もここに失われたコードを入れて退屈。
//mid:中序遍历
//back:后序遍历
//length:数组长度
Tree* Fun2(const int *mid,const int *back,const int length){
//当空指针或者数组长度为0时返回
if(back==NULL||mid==NULL||length<=0)
return NULL;
//建立根节点
Tree *head=new Tree();
head->val=back[length-1];
head->left=head->right=NULL;
//找到中序遍历中根节点所在位置
int index=0;
while(index<length){
if(head->val==mid[index]){
break;
}
++index;
}
//划分左子树
head->left=Fun2(mid,back,index);
//划分右子树
head->right=Fun2(mid+index+1, back+index, length-index-1);
return head;
}
あなたはそれを予約限定しない場合は?フロントオーダートラバーサルと後順ツリーは、それを起動するために落ちることができますか?利害関係者は、私は別の記事を見ることができる任意の2つのバイナリツリートラバーサルの再構築を使用します。