題目描述:
輸入:兩個字串,其長度n均小於等於26。
第一行為前序遍歷,第二行為中序遍歷。
二叉樹中的結點名稱以大寫字母表示:a,b,c....最多26個結點。
輸出:輸入樣例可能有多組,對於每組測試樣例,
輸出一行,為後序遍歷的字串。
樣例輸入:
abcbacfdxeag
xdefag
樣例輸出:
bcaxedgaf
已知二叉樹的前序遍歷與中序遍歷,求後續遍歷。
前序遍歷方式為:根節點->左子樹->右子樹
中序遍歷方式為:左子樹->根節點->右子樹
後序遍歷方式為:左子樹->右子樹->根節點
從這裡可以看出,前序遍歷的第乙個值就是根節點,然後再中序遍歷中找到這個值,那麼這個值的左邊部分即為當前二叉樹的左子樹部分前序遍歷結果,這個值的右邊部分即為當前二叉樹的右子樹部分前序遍歷結果。因此,通過這個分析,可以恢復這棵二叉樹,得到這樣的一段偽碼:
節點 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...