GPLT L2 006 樹的遍歷(二叉樹)

2022-03-05 14:09:04 字數 1362 閱讀 9489

給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。

後序遍歷序列 = 左子樹遍歷序列 + 右子樹遍歷序列 + 根節點。

中序遍歷序列 = 左子樹遍歷序列 + 根節點 + 右子樹遍歷序列。

找到根節點,再利用根節點計算新的後、中遍歷序列端點。

注意建樹時傳根節點的引用。

#include using

namespace

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 using

namespace

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個空格分隔,行首尾不得有多餘空格。...