對於樹的兩序求型的分析

2021-07-27 23:11:48 字數 2081 閱讀 9034

在樹的先序、中序、後序和層次中,中序可以和任意組合完成重建樹,其餘二二並不能保證重建樹的唯一性。

一、已知樹的先序和中序

先序為pre1~pren,中序為in1~inn。先序列中的第乙個數為樹的根,再由中序的特點可以在找到根結點的情況下分成左樹右樹,我們對中序查詢,假設找到根結點的位置為k,則左樹是k-1個,那麼我們可以將先序中的2-k和中序中的1-k-1再次按照以上規則找到根結點的左孩子,按照先序k+1~n和中序k+1~n按照規則找到根結點的右孩子。

這樣什麼時候是個頭呢,當先序長度為零時,即prel>prer時,就可以return了。下面用簡單的演算法實現一下。

const int max = 40;

int n;

struct node;

int pre[max]=,in[max]=;

node* buildtree(int prel,int prer,int inl,int inr)

node* root = new node;

root->data=pre[prel];

int k;

for(k=inl;k<=inr;k++) }

int numl=k-inl;

root->lchild=buildtree(prel+1,prel+numl,inl,inl+numl-1);

root->rchild=buildtree(prel+numl+1,prer,inl+numl+1,inr);

return root;

}

二、已知中序和後序,構造樹,其實思路和第乙個的思路差不多

const int max = 40;

int n;

struct node;

int post[max]=,in[max]=;

node* buildtree(int postl,int postr,int inl,int inr)

node* root = new node;

root->data=post[postr];

int k;

for(k=inl;k<=inr;k++) }

int numl=k-inl;

root->lchild=buildtree(postl,postl+numl-1,inl,inl+numl-1);

root->rchild=buildtree(postl+numl,postr-1,inl+numl+1,inr);

return root;

}

三、已知前序和後序,求中序

開頭講過,如果你不知道中序,你很難得到樹的唯一解,但是可以判斷是否唯一,樹是否唯一的關鍵點在與,當你在後序中找到乙個點,如果他在前序的現有序列中排在第二個(第乙個肯定是根結點),那麼它一定不是唯一的,因為你不知道它是根結點的左孩子還是右孩子,因此我們可以通過這個,來確定其是否唯一。然後接下來的問題就是在於遞迴了,一開始,我們先找到後序中的最後乙個點,然後在先序中找到他的位置,他就是我們這次遞迴的根結點,然後再找後序的倒數第二個點,如果它符合唯一性,那麼我們在先序中找到這個點,就可以得到左邊有幾個結點和右邊結點的數量,假設我們是按0~n-1排的,得到的在先序位置為k,那麼,左邊的數量就是k-prel-1,對於先序,遍歷它左孩子的邊就是 prel+1,k-1  後序則是postl,postl+k-pre-2.對於右孩子,先序是 k,prel 後序是 postl+k-prel-1,postr-1 .

然後我們可以用乙個容器,來儲存點,只要保證 先遍左,再存自己,再遍右,就一定會得到中序。

const int max = 40;

int n;

struct node;

vectors;

int post[max]=,pre[max]=;

int findlocate(int x,int l,int r)

} return -1;

}int u=1;

void setin(int prel,int prer,int postl,int postr)

if(pre[prel]==post[postr])

else

}}

結束

二叉樹的中序後序排列求先序 先序中序排列求後序

本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。第一行給出正整數n 30 是樹中結點的個數。隨後兩行,每行給出n個整數,分別對應後序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。在一行中輸出preorder 以及該樹的先序遍歷結果。數字間有1個空...

已知樹的中序序列和先序 後序序列,求樹的結構?

已知樹的中序序列和先序 後序序列,求樹的結構?這類問題比較經典了,剛好csdn上有人問起,所以自己寫了乙個遞迴演算法,根據中序和先序 後序 建立樹結構。這裡需要說明的是 必須要知道中序序列,先序和後序可選的情況下才能推導出樹結構,只知道後序先序是推導不出。簡單說明一下基本思路,例 已知後序 debg...

E 求二叉樹的層次遍歷(先序中序求層序)

description 已知一顆二叉樹的前序遍歷和中序遍歷,求二叉樹的層次遍歷。input 輸入資料有多組,輸入t,代表有t組測試資料。每組資料有兩個長度小於50的字串,第乙個字串為前序遍歷,第二個為中序遍歷。output 每組輸出這顆二叉樹的層次遍歷。sample input 2abc bacab...