題意翻譯
輸入乙個二叉樹的中序和後序遍歷,請你輸出乙個葉子節點,該葉子節點到根的數值總和最小,且這個葉子是編號最小的那個。 輸入: 您的程式將從輸入檔案中讀取兩行(直到檔案結尾)。第一行是樹的中序遍歷值序列,第二行是樹的後序遍歷值序列。所有值將不同,大於零且小於或等於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的正整數 的二叉樹的中序和後序遍歷,找乙個葉子使得它到根的路徑上的權和最小。如果有多解,該葉子本身的權應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後序遍歷。首先介紹下二叉樹的三種遍歷 首先我想先改變這幾個遍歷的名字 前根序遍歷,...