給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。
後序遍歷序列 = 左子樹遍歷序列 + 右子樹遍歷序列 + 根節點。
中序遍歷序列 = 左子樹遍歷序列 + 根節點 + 右子樹遍歷序列。
找到根節點,再利用根節點計算新的後、中遍歷序列端點。
注意建樹時傳根節點的引用。
#include usingnamespace
std;
const
int m=35
;int n,a[m],b[m];//
a陣列儲存後序遍歷,b陣列儲存中序遍歷
map posb;//
後序遍歷中某點在中序遍歷中的位置
struct bt*root;
void build_tree(bt* & rt,int l1,int r1,int l2,int r2)
rt=new
(bt);
rt->v=a[r1];//
後序倒數第乙個即為該子樹的根節點
int mid=posb[a[r1]];//
該端點在中序遍歷中的位置
int len=mid-l2;//
左子樹的長度
build_tree(rt->l,l1,l1+len-1,l2,mid-1);//
遞迴建立左子樹
build_tree(rt->r,l1+len,r1-1,mid+1,r2);//
遞迴建立右子樹
}void print_level(bt*t)
}}int
main()
build_tree(root,
0,n-1,0,n-1
); print_level(root);
return0;
}
#include usingnamespace
std;
const
int m=35
;struct
bt;int n,a[m],b[m];//
a陣列儲存後序遍歷,b陣列儲存中序遍歷
map posa,posb;//
某值在後序、中序遍歷中的位置
bt *root;
void build_node(bt* & pre,int last,int l,int r)
void print_level(bt*t)
}}int
main()
for(int i=0;i)
build_node(root,n-1,0,n-1
); print_level(root);
return0;
}
GPLT L2 006 樹的遍歷
給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。...
GPLT L2 006 樹的遍歷
給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。輸出格式 在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行...
L2 006 樹的遍歷 二叉樹
給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。...