【題目】
給一棵點帶權(權值各不相同,都是小於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.由於每個節點值不同,可以用節點值來作陣列索引。
in_order和post_order分別是中序遍歷和後序遍歷的陣列,lch和rch是某個根節點左子樹與右子樹的根。#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;
讀入陣列,在主函式中a將被in_order/post_order替代。接下來是構造樹並記錄求最小權和的過程。bool read_list(int *a)
return n>0;
}
如果root節點的左右子樹值都是0,說明root是葉子,那麼就可以進行sum的判斷。到這裡之後,後面開始呼叫函式就好啦!int build(int l1,int r1,int l2,int r2,int sum)
return root;
}
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.如何根據二叉樹的中序遍歷和後序遍歷構造出...