題意:給一顆點帶權(權值各不相同,都是小於10000的正整數)的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權和最小。如果有多解,該葉子本身的權應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。
首先介紹下二叉樹的三種遍歷:
首先我想先改變這幾個遍歷的名字(前根序遍歷,中根序遍歷,後根序遍歷);前中後本來就是相對於根結點來說的,少乙個字會產生很多不必要的誤解。
1. 前根序遍歷:先遍歷根結點,然後遍歷左子樹,最後遍歷右子樹。
abdhecfg
2.中根序遍歷:先遍歷左子樹,然後遍歷根結點,最後遍歷右子樹。
hdbeafcg
3.後根序遍歷:先遍歷左子樹,然後遍歷右子樹,最後遍歷根節點。
hdebfgca
已知一棵二叉樹的後根序序列和中根序序列,構造該二叉樹的過程如下:
1. 根據後根序序列的最後乙個元素建立根結點;
2. 在中根序序列中找到該元素,確定根結點的左右子樹的中根序序列;
3. 在後根序序列中確定左右子樹的後根序序列;
4. 由左子樹的後根序序列和中根序序列建立左子樹;
5. 由右子樹的後根序序列和中根序序列建立右子樹。
思路:給定二叉樹的中序遍歷和後序遍歷,可以構造出這顆二叉樹。方法是根據後序遍歷找到樹根,然後在中序遍歷中找到樹根,從而找出左右子樹的結點列表,然後遞迴構造
左右子樹。
初學者可以自己根據測試案例在紙上模擬一下** 就可以很好的理解了。
**如下:
#include
#include
#include
#include
using namespace std;
const int maxv=10000+10;
int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv];
int n;
bool read_list(int *a)
int build(int l1,int r1,int l2,int r2)
int best,best_sum;
void dfs(int u,int sum)
}if(lch[u])
dfs(lch[u],sum);
if(rch[u])
dfs(rch[u],sum);
}int main()
return 0;
}
二叉樹遞迴遍歷 UVa548樹
題目 給一棵點帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權值和最小。如果有多解,該葉子本身的權應盡量小。輸出中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。樣例輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 7 ...
演算法入門經典二叉樹DFS題目UVA548 Tree
問題描述 給一棵點帶權的二叉樹的中序和後序遍歷,找乙個葉子使得到它的根的路徑上的權和最小。輸入中沒兩行表示一棵樹,第一行為中序遍歷,第二行為後序遍歷。樣例輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 樣例輸出 1 分析一下 此題有兩個難點,1.如何根據二叉樹的中序遍歷和後序遍歷構造出...
Tree UVA 548(二叉樹遞迴遍歷)
題目大意 給一顆點帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序遍歷和後序遍歷,找乙個葉子結點使得它到根的路徑上的權值和最小。如果有多個解,該葉子本身的權值應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後續遍歷。看 include include include i...