二叉樹遞迴遍歷 UVa548樹

2021-08-18 08:07:49 字數 1109 閱讀 2791

【題目】

給一棵點帶權(權值各不相同,都是小於10000的正整數)的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權值和最小。如果有多解,該葉子本身的權應盡量小。輸出中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。

樣例輸入:

3 2 1 4 5 7 6

3 1 2 5 6 7 4

7 8 11 3 5 16 12 18

8 3 11 7 16 18 12 5

樣例輸出:

【解析】

1.在二叉樹後序遍歷中,輸入的最後乙個點是根節點,通過根節點在中序遍歷中找到左子樹和右子樹。

2.遞迴求解,分別按左和右構建子樹。

3.由於每個節點值不同,可以用節點值來作陣列索引。

#include#include#include#includeusing namespace std;

const int maxv=1000+10;

int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv];

int n;

int u,best_sum;

in_order和post_order分別是中序遍歷和後序遍歷的陣列,lch和rch是某個根節點左子樹與右子樹的根。

bool read_list(int *a)

return n>0;

}

讀入陣列,在主函式中a將被in_order/post_order替代。接下來是構造樹並記錄求最小權和的過程。

int build(int l1,int r1,int l2,int r2,int sum)

return root;

}

如果root節點的左右子樹值都是0,說明root是葉子,那麼就可以進行sum的判斷。到這裡之後,後面開始呼叫函式就好啦!

int main()

{ while(read_list(in_order))

{read_list(post_order);

best_sum=100000;

build(0,n-1,0,n-1,0);

cout<

UVa 548 二叉樹的遞迴遍歷 dfs)

題意 給一顆點帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權和最小。如果有多解,該葉子本身的權應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。首先介紹下二叉樹的三種遍歷 首先我想先改變這幾個遍歷的名字 前根序遍歷,...

UVA 548 樹 遞迴典型

題目鏈結 給定一顆節點帶權的二叉樹的中序遍歷序列和後序遍歷序列,要求找出葉子節點中到根的路徑上的權和最小的節點。注 1.所有節點的權值都不同 2.如果權和最小的葉子節點有多個,輸出其中權值最小的。題目思路 首先根據後序遍歷序列和中序遍歷序列構建該二叉樹。從根節點進行dfs遍歷整棵樹,找到符合條件的葉...

演算法入門經典二叉樹DFS題目UVA548 Tree

問題描述 給一棵點帶權的二叉樹的中序和後序遍歷,找乙個葉子使得到它的根的路徑上的權和最小。輸入中沒兩行表示一棵樹,第一行為中序遍歷,第二行為後序遍歷。樣例輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 樣例輸出 1 分析一下 此題有兩個難點,1.如何根據二叉樹的中序遍歷和後序遍歷構造出...