給出一顆二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度小於等於8)
題目鏈結求先序排列 - 洛谷
見題目鏈結
見題目鏈結
見題目鏈結
1、首先,在後序遍歷中,最後乙個節點一定是根節點(這一點對任何一顆子樹都成立)
2、根據根節點,在中序遍歷中,根節點的兩側分別是該根節點的左子樹(左葉子)和右子樹(右葉子),而在後序遍歷中,根節點的前面,與從中序遍歷中得到的左右序列長度分別相等的就是後序遍歷中對應的兩個左右序列。
3、由此我們可以在後序遍歷中再次分出的兩個左右序列中進行操作1、2,找到最後乙個節點作為根節點,對序列不斷進行劃分,直到分到最後的葉子節點。
#include #include typedef struct treelinklist;
linklist *head, *end, *node;
char str1[8], str2[8];
int maketree(int s1,int e1,int s2,int e2,int temp)
if (temp == 0)
if (temp == 1)
node->c = flag;
if (s1 == e1)
end = node;
for (int i = s1; i <= e1;i++)
}end = end_before;
return 0;
}int search(linklist *node)
int main()
鍊錶結構體定義:
typedef struct treelinklist;
c儲存序列字母,left指向左兒子,right指向右兒子。
通過中序排列和後序排列構造二叉樹:
int maketree(int s1,int e1,int s2,int e2,int temp)
if (temp == 0)
if (temp == 1)
node->c = flag;
if (s1 == e1)
end = node;
for (int i = s1; i <= e1;i++)
}end = end_before; //回溯,將被修改的end還原成end_before,即恢復成當前節點的父親節點(end由於是乙個全域性變數,在前面maketree的呼叫過程中值已經發生了變化,因此我們要將它復原)
return 0;
}
s1代表中序排列字串的第乙個位置,e1代表中序排列字串的最後乙個位置
s2代表後序排列字串的第乙個位置,e2代表後序排列字串的最後乙個位置
temp用來標記這是乙個左兒子還是右兒子還是頭節點。如果是頭節點,傳入-1,左兒子傳入0,右兒子傳入1
關鍵部分在於在中序序列中找到對應的根節點後,如何分割序列,繼續呼叫maketree函式的部分。
(關鍵在於,同一子樹在中序序列和後序序列中的長度是相同的)
對於左兒子的中序序列來說,它的第乙個位置就是當前中序序列的第乙個位置,它的最後乙個位置應是當前中序序列根節點的前乙個位置。
對於左兒子的後序序列來說,它的第乙個位置就是當前後序序列的第乙個位置,它的最後乙個位置應是在後序序列第乙個位置加上左兒子序列長度後得到的位置。
對於右兒子的中序序列來說,它的第乙個位置就是當前中序序列根節點之後的那個位置,它的最後乙個位置是當前中序序列的最後乙個位置。
對於右兒子的後序序列來說,它的第乙個位置是左兒子後序序列最後乙個位置加一,最後乙個位置是當前後序序列的倒數第二個位置。
前序遍歷:
int search(linklist *node)
P1030 求先序排列 STL,二叉樹遍歷
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 le 8 8 22行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。11行,表示一棵二叉樹的先序。輸入 1複製 badc bdca輸出 1複製 abcd題解 二叉樹的遍歷分別如下 前序 根 左 右 中序...
洛谷 P1030 求先序排列(樹的遍歷)
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 le 8 8 22行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。11行,表示一棵二叉樹的先序。輸入 badc bdca輸出 abcd1.s.substr pos,n 返回字串s從pos開始後n個字元...
洛谷 P1030 求先序排列
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度8 8 輸入格式 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。輸出格式 1行,表示一棵二叉樹的先序。思路 1.通過後序找根節點 2.通過根節點回中序劃分左右子樹 3.重複1,2 ps 雖然思路蠻清...