7004 二叉樹的遍歷問題

2021-09-28 10:05:21 字數 1818 閱讀 7087

time limit: 10 second

memory limit: 2 mb

問題描述

輸入一棵二叉樹的先序和中序遍歷序列,輸出其後序遍歷序列。

輸入檔案共兩行,第一行乙個字串,表示樹的先序遍歷,第二行乙個字串,表示樹的中序遍歷。樹的結點一律用小寫字母表示。

輸出檔案僅一行,表示樹的後序遍歷的序列。 

abdec

dbeac

debca
【題解】

先序遍歷。

是先輸出當前訪問到的節點。

然後訪問左兒子。然後訪問右兒子。

這也就是說先序遍歷的第乙個節點肯定是根節點。

然後中序遍歷。是先訪問左兒子。然後輸出訪問的節點。然後輸出右兒子。

我們可以先根據先序遍歷。找到這個樹的根節點。

假設根節點root在中序遍歷中的位置為pos.

則1..pos-1為根的左子樹。

pos+1..max為根的右子樹。

然後1..pos-1這個左子樹。它的根節點是什麼呢?

當然就是先序遍歷的第二個節點。

因為先序遍歷是先訪問了根節點。且先輸出根節點。

然後訪問根節點的左子樹。當然第乙個訪問的是左子樹的根節點。然後輸出這個左子樹的根節點。然後。。

對!就在第二個節點。它就是我們需要的左子樹的根節點。

然後我們依然用中序遍歷。找到這個《左子樹的根節點》的左子樹和右子樹。

依次類推。根節點的左子樹的左子樹的根節點為先序遍歷的第3個節點..

這些子樹可以用區間先表示出來。

如果區間的大小則這個節點為最下面一層的節點。葉子節點。那麼就不要繼續操作了。

然後每層遞迴(什麼?你還看不出來這裡要用遞迴??)都要返回當前這段區間的根節點。給這個根節點

的爸爸。

然後根據得到的l和r陣列(表示某個節點的左兒子和右兒子)。從根節點開始進行後序遍歷。

(後序遍歷:先訪問左兒子。後訪問右兒子。最後輸出當前訪問的這個節點);

【**】

#include #include #include using namespace std;

string s1, s2;

int tot,ll[29],rr[29],root;

int xianxu[29], zhongxu[29];

int now = 1;

void input_data() //輸入有這麼多行。是為了在字串前面加乙個空格。

int sear_ch(int l, int r) //返回l..r這段區間的根節點。

now++;//尋找先序遍歷**現的下乙個元素即該根節點key2的左子樹的根節點。

ll[key2] = sear_ch(l, pp - 1); //注意我們每一段區間的根節點都有記錄下來(key2)。然後返回即可。

rr[key2] = sear_ch(pp + 1, r); //先序是先訪問完左子樹再訪問右子樹的。要遵循其規律。

return key2;//返回l..r這個區間的根節點。 }}

void output_ans(int t) //這是後序遍歷一棵樹的遞迴程式。

void get_ans()

now++;//接下來xianxu[now]指向根節點的左子樹的根節點。

ll[root] = sear_ch(1, pos - 1);//這是其左子樹 sear_ch(l,r)函式會返回l..r這段區間的根節點。

rr[root] = sear_ch(pos + 1, xianxu[0]);//這是其右子樹。

output_ans(root);

}int main()

二叉樹遍歷問題

給定二叉樹的先序遍歷和後序遍歷,計算可能有幾棵二叉樹 input 本問題有多組測試資料,第一行是測試資料的組數n,緊接著是n組測試資料。每組測試資料有兩行,分別表示二叉樹的先序遍歷和後序遍歷,每個結點用大寫字母表示,輸入保證資料是正確的。output 對於每一組輸入,對應的輸出只有一行,即符合給定的...

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...