第十六題 UVA548 樹 Tree

2021-10-01 22:55:37 字數 3539 閱讀 4208

題意翻譯

輸入乙個二叉樹的中序和後序遍歷,請你輸出乙個葉子節點,該葉子節點到根的數值總和最小,且這個葉子是編號最小的那個。 輸入: 您的程式將從輸入檔案中讀取兩行(直到檔案結尾)。第一行是樹的中序遍歷值序列,第二行是樹的後序遍歷值序列。所有值將不同,大於零且小於或等於10000.二叉樹的節1<=n<=10000。 輸出: 對於每個樹描述,您應該輸出最小值路徑的葉節點的值。存在多路徑最小的情況下,您應該選擇終端葉子節點上具有最小值的那條路徑,且輸出那個最小值的終端葉子。

translated by @涼涼

輸入輸出樣例

輸入 #1複製

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

255255

輸出 #1複製13

255根據中序遍歷和後序遍歷建樹,然後按照題意求解

搞了半天搞出來了,然後我發現樹節點的編號並不一定是1~n連續的,我心態崩了呀

//節點 1~n連續的**   顯然不能ac

#include

#include

#include

#define maxn 100010

using

namespace std;

struct nodetre[maxn]

;int las[maxn]

,mid[maxn]

;int pos =

0,sum =

99999999

;int

creat

(int l1,

int r1,

int l2,

int r2)

if(l1 > r1)

return-1

;int root;

for(root=l1; root<=r1; root++)if

(mid[root]

== las[r2]

)break

; tre[mid[root]

].l =

creat

(l1, root-

1, l2, l2 +

(root - l1 -1)

);tre[mid[root]

].r =

creat

(root +

1, r1,l2 +

(root - l1 -1)

+1, r2 -1)

; tre[mid[root]

].node = mid[root]

;return mid[root];}

void

dfs(

int p,

int sum)

return;}

if(tre[p]

.l !=-1

)dfs

(tre[p]

.l,sum + tre[tre[p]

.l].node);if

(tre[p]

.r !=-1

)dfs

(tre[p]

.r,sum + tre[tre[p]

.r].node);}

void

dfs(

int node)

intmain()

scanf

("%d"

,&las[

++k2]);

while(1

)int head =

creat(1

,k1,

1,k2)

;dfs

(head,tre[head]

.node)

;printf

("%d\n"

,pos);}

return0;

}

// ac**

#include

#include

#include

#include

#include

using

namespace std;

struct tree t[

100100];

//陣列模擬的二叉樹

int m_sum=

100000000

,pos;

//用於dfs時儲存結果

int mid[

100100

],last[

100100];

intcreate_tree

(int m1,

int m2,

int l1,

int l2)

if(m1>m2)

return-1

;int i;

for(i=

0; i<=m2; i++)if

(mid[i]

==last[l2]

)break

;

t[i]

.left=

create_tree

(m1,i-

1,l1,l1+i-m1-1)

;//遞迴建樹!!注意四個引數,runtime好多遍

t[i]

.right=

create_tree

(i+1

,m2,l1+i-m1,l2-1)

; t[i]

.data=mid[i]

;return i;

}int

dfs(

int head,

int m)

return t[head]

.data;

}int sum=t[head]

.data;

if(t[head]

.left!=-1

&&t[head]

.right==-1

) sum +

=dfs

(t[head]

.left,m)

;else

if(t[head]

.right!=-1

&&t[head]

.left==-1

) sum +

=dfs

(t[head]

.right,m)

;else sum +

=min

(dfs

(t[head]

.left,m)

,dfs

(t[head]

.right,m));

return sum;

}int

main()

k1--

,k2=0;

while(1

) k2--

;int t_head=

create_tree(0

,k1,

0,k2)

;dfs

(t_head,0)

;printf

("%d\n"

,pos);}

return0;

}

UVA 548 樹 遞迴典型

題目鏈結 給定一顆節點帶權的二叉樹的中序遍歷序列和後序遍歷序列,要求找出葉子節點中到根的路徑上的權和最小的節點。注 1.所有節點的權值都不同 2.如果權和最小的葉子節點有多個,輸出其中權值最小的。題目思路 首先根據後序遍歷序列和中序遍歷序列構建該二叉樹。從根節點進行dfs遍歷整棵樹,找到符合條件的葉...

二叉樹遞迴遍歷 UVa548樹

題目 給一棵點帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權值和最小。如果有多解,該葉子本身的權應盡量小。輸出中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。樣例輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 7 ...

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

題意 給一顆點帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權和最小。如果有多解,該葉子本身的權應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。首先介紹下二叉樹的三種遍歷 首先我想先改變這幾個遍歷的名字 前根序遍歷,...