二叉樹的遍歷)Tree UVa 548

2021-08-21 20:23:09 字數 1780 閱讀 9587

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

#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)

// 把in_order[l1..r1]和post_order[l2..r2]建成一棵二叉樹,返回樹根

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;}

Tree UVA 548(二叉樹遞迴遍歷)

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

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...