time limit: 10 second
memory limit: 2 mb
問題描述
輸入一棵二叉樹的中序和後序遍歷序列,輸出其前序遍歷序列。
輸入檔案共兩行,第一行乙個字串,表示樹的中序遍歷,第二行乙個字串,表示樹的後序遍歷。樹的結點一律用小寫字母表示。
輸出檔案僅一行,表示樹的後前序遍歷的序列。
dbeacdebca
abdec【題解】
這個後序遍歷可以把它反轉一下
如debca可以反轉為acbed
然後它就會變成乙個特殊的前序遍歷了。
原來是輸出當前節點,然後訪問左兒子。然後訪問右兒子。
這個特殊的前序遍歷則是輸出當前節點。然後訪問右兒子。然後訪問左兒子。
即它的訪問順序改變了。
至於為什麼
後序遍歷是先訪問左兒子。然後訪問右兒子。最後輸出當前節點。
根據這個規律。可以知道最後出現的節點肯定是根節點。
那倒數第二個節點是什麼呢。
肯定有這樣乙個過程。
左子樹訪問完了。然後右子樹也訪問完了。
可以想象。訪問到右子樹的最低端之後。會逐級往上輸出節點。
那除了根節點之外。前乙個當然就是根節點的右子樹的根節點了。
再前乙個(倒數第三個)則為根節點的右子樹的右子樹的根節點
(如果根節點的右子樹存在右子樹,若不存在右子樹只存在左子樹。那它就是根節點的
右子樹的左子樹的根節點)
然後。根據中序遍歷的規律。我們可以找到乙個根節點它的左子樹和右子樹包括哪一些
節點。如根節點為p
1..p-1,p+1..r則分別為它的左子樹和右子樹。
這是用區間表示的。如果這段區間只有乙個元素。則返回這個元素。否則返回這段區間的根節點即可。
這樣我們就可以求出所有節點的左兒子和右兒子了。
最後先序遍歷一下就好。
用遞迴寫!!!!!
【**】
#include #include int zhongxu[30], houxu[30],ll[30],rr[30],now;
void input_data()
int sear_ch(int l,int r) //返回l..r這個區間內的根節點。
now--;//這時指標指向下乙個子樹的根節點 優先是右子樹(如果有右子樹)
rr[key2] = sear_ch(pp+1, r);//尋找l..r這個區間的根節點的左兒子和右兒子。
ll[key2] = sear_ch(l, pp-1);
return key2;//返回這個區間的根節點給這個根節點的爸爸。
}void xianxu(int t)//這是找到所有節點的左兒子和右兒子之後進行先序遍歷。
void get_ans()
now--;//houxu[now]指向下乙個子樹的根節點(優先右子樹。如果不存在右子樹則指向左子樹的根節點)
rr[root] = sear_ch(p + 1, zhongxu[0]);
ll[root] = sear_ch(1, p - 1);
xianxu(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 最後乙個父節...