日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(二叉树的遍历)Tree UVa 548

發布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (二叉树的遍历)Tree UVa 548 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

給一棵點帶權(權值各不相同,都是小于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
255
255
樣例輸出:
1
3
255

分析與解答

1.先序遍歷:根左右。中序遍歷:左根右。后序遍歷:左右根
2.通過遞歸把每個根連的子樹分別輸入到lch[],rch[]
中序:3,2,1,4,5,7,6
后序:3,1,2,5,6,7,4
根節點4

左子樹a元素:3,2,1
同時左子樹a的后序是:3,1,2
因此左子樹a根節點是:2

左子樹b元素:3
左子樹b根節點:3

左子樹c的最右邊元素下標為b根節點下標減一,但此時b下標為零,所以最右邊元素下標為-1.我們認為最左子樹c最左邊元素下標為0,顯然此時l1>r1不成立,遞歸結束,我們返回0

lch[3]=0 ——> lch[2]=3——>lch[4]=2

lch[root]=leftleaf
表示一個根root所連的左子葉
rch[root]=rightleaf
表示一個根root所連的右子葉

3.葉子到根上路徑權和最小,如果有多解,葉子本身權應盡量小

lch[root]=leftleaf,而每一個子葉都相當于一個子樹的根,因此我們可以從根到子葉進行遍歷,每次sum加上子葉的值,然后進行限制條件判斷

4.輸入存到兩個數組里的方法
由于輸入是不定長的,所以利用string,然后stringstream重定向輸入到數組里
5.代碼參照劉汝佳,以后復習再重新寫一遍

// 題意:給一棵點帶權(權各不相同,都是正整數)二叉樹的中序和后序遍歷,找一個葉子使得它到根的路徑上的權和最小。如果有多解,該葉子本身的權應盡量小 // 算法:遞歸建樹,然后DFS。注意,直接遞歸求結果也可以,但是先建樹的方法不僅直觀,而且更好調試 #include<iostream> #include<string> #include<sstream> #include<algorithm> 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) {string line;if(!getline(cin, line)) return false;stringstream ss(line);n = 0;int x;while(ss >> x) a[n++] = x;return n > 0; }// 把in_order[L1..R1]和post_order[L2..R2]建成一棵二叉樹,返回樹根 int build(int L1, int R1, int L2, int R2) {if(L1 > R1) return 0; // 空樹int root = post_order[R2];int p = L1;while(in_order[p] != root) p++;int cnt = p-L1; // 左子樹的結點個數lch[root] = build(L1, p-1, L2, L2+cnt-1);rch[root] = build(p+1, R1, L2+cnt, R2-1);return root; }int best, best_sum; // 目前為止的最優解和對應的權和void dfs(int u, int sum) {sum += u;if(!lch[u] && !rch[u]) { // 葉子if(sum < best_sum || (sum == best_sum && u < best)) { best = u; best_sum = sum; }}if(lch[u]) dfs(lch[u], sum);if(rch[u]) dfs(rch[u], sum); }int main() {while(read_list(in_order)) {read_list(post_order);build(0, n-1, 0, n-1);best_sum = 1000000000;dfs(post_order[n-1], 0);cout << best << "\n";}return 0; }

總結

以上是生活随笔為你收集整理的(二叉树的遍历)Tree UVa 548的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。