バイナリ復興と行きがけを使用して注文トラバーサル

バイナリ復興と行きがけを使用して注文トラバーサル

序文

私は、このような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つのバイナリツリートラバーサルの再構築を使用します

公開された63元の記事 ウォン称賛73 ビュー70000 +

おすすめ

転載: blog.csdn.net/jjwwwww/article/details/85799421
おすすめ