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

2021-08-05 23:03:39 字數 1284 閱讀 1280

題意:給一顆點帶權(權值各不相同,都是小於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...