二叉樹遍歷題解(已知中序,層次遍歷,求後序遍歷)
阿新 • • 發佈:2019-02-15
題目:
樹和二叉樹基本上都有先序、中序、後序、按層遍歷等遍歷順序,給定中序和其他一種遍歷的序列就可以確定一棵二叉樹的結構。
假設一棵二叉樹一個結點用一個字元描述,現在給出中序和按層遍歷的字串,求該樹的先序遍歷字串。
輸入:
輸入共兩行,每行是由字母組成的字串(一行的每個字元都是唯一的),分別表示二叉樹的中序遍歷和按層遍歷的序列。
輸出:
輸出就一行,表示二叉樹的先序序列。
樣例輸入:DBEAC
ABCDE
樣例輸出:ABDEC
題解:
本題不需要建樹。
做題前先弄明白中序遍歷和層次遍歷的特點;
首先中序遍歷的根結點左側為左子樹,右側為右子樹,而先序遍歷優先輸出根結點,再遍歷左子樹,最後遍歷右子樹,因此,不難想到,先在中序遍歷中找到根結點,再先後遞迴左右子樹;
然後,我們單開一個數組從1到結尾給層次遍歷的結果做標記,方便在遞迴中找到根結點(即使遞迴到了子樹也可行)。見程式碼:
#include<stdio.h> #include<string.h> int len,mark[102]; //用來給中序遍歷做標記 char s1[102],s2[102]; //儲存遍歷 void tree(int l,int r){ //遞迴函式 if(l>r)return; //返回條件,不能等於 int i,j,min=0x7fffff/*int範圍的最大值*/,root; for(i=l;i<=r;i++){ if(mark[s1[i]]<min){ min=mark[s1[i]];root=i; //在中序遍歷中找到層次遍歷裡的最靠前的結點(即先序遍歷中要求優先輸出的根結點 } } printf("%c",s1[root]); //輸出根結點 tree(l,root-1); //先遍歷左子樹 tree(root+1,r); //再遍歷右子樹,順序不能調換 } int main(){ scanf("%s%s",s1+1,s2+1); len=strlen(s2+1); int i; for(i=1;i<=len;i++) mark[s2[i]]=i; //做標記,雖然s2[i]為字元,但視為ASCII碼值,越靠前標記值越小 tree(1,len); }
歡迎指點