Jobdu 題目1078 二叉樹遍歷

2022-09-15 23:09:11 字數 1373 閱讀 5509

題目描述:

輸入:兩個字串,其長度n均小於等於26。

第一行為前序遍歷,第二行為中序遍歷。

二叉樹中的結點名稱以大寫字母表示:a,b,c....最多26個結點。

輸出:輸入樣例可能有多組,對於每組測試樣例,

輸出一行,為後序遍歷的字串。

樣例輸入:

abc

bacfdxeag

xdefag

樣例輸出:

bca

xedgaf

已知二叉樹的前序遍歷與中序遍歷,求後續遍歷。

前序遍歷方式為:根節點->左子樹->右子樹

中序遍歷方式為:左子樹->根節點->右子樹

後序遍歷方式為:左子樹->右子樹->根節點

從這裡可以看出,前序遍歷的第乙個值就是根節點,然後再中序遍歷中找到這個值,那麼這個值的左邊部分即為當前二叉樹的左子樹部分前序遍歷結果,這個值的右邊部分即為當前二叉樹的右子樹部分前序遍歷結果。因此,通過這個分析,可以恢復這棵二叉樹,得到這樣的一段偽碼:

節點 getroot(前序,中序)

c=前序第乙個字元

pos=c在中序中的位置

len1=中序pos左半部分長度

len2=中序pos右半部分長度

新建節點r,令r的元素等於c

r的左兒子=getroot(前序位置1開始的len1長度部分,中序pos位置的左半部分)

r的右兒子=getroot(前序位置len1開始右半部分,中序pos位置的右半部分)

return r

#include using namespace std;

struct node

};string a,b;

char gentree(node *t,string a,string b)

lb = b.substr(0,mid);

rb = b.substr(mid+1,b.length());

la = a.substr(1,lb.length());

ra = a.substr(a.length()-rb.length(),a.length());

t->left = new node(la[0]);

gentree(t->left,la,lb);

t->right = new node(ra[0]);

gentree(t->right,ra,rb);

}}void postorder(node *t)

}int main(int argc,char* ar**)

return 0;

}

題目1078 二叉樹遍歷

題目描述 輸入 兩個字串,其長度n均小於等於26。第一行為前序遍歷,第二行為中序遍歷。二叉樹中的結點名稱以大寫字母表示 a,b,c.最多26個結點。輸出 輸入樣例可能有多組,對於每組測試樣例,輸出一行,為後序遍歷的字串。樣例輸入 abc bacfdxeag xdefag 樣例輸出 bca xedga...

題目1078 二叉樹遍歷

題目描述 輸入 兩個字串,其長度n均小於等於26。第一行為前序遍歷,第二行為中序遍歷。二叉樹中的結點名稱以大寫字母表示 a,b,c.最多26個結點。輸出 輸入樣例可能有多組,對於每組測試樣例,輸出一行,為後序遍歷的字串。樣例輸入 abc bacfdxeag xdefag 樣例輸出 bca xedga...

題目1078 二叉樹遍歷

此題涉及到二叉樹的遍歷以及二叉樹的建立 include include using namespace std struct node 定義樹的結點 node tree 50 結點陣列 string str1,str2 void postorder node t if t rchild null c...