重新建立二叉樹(根據前中,後中重新建立二叉樹)

2021-10-10 14:59:53 字數 1483 閱讀 4002

團體程式設計天梯賽-練習集

l2-006 樹的遍歷 (25分)

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

輸入第一行給出乙個正整數n(≤30),是二叉樹中結點的個數。第二行給出其後序遍歷序列。第三行給出其中序遍歷序列。數字間以空格分隔。

在一行中輸出該樹的層序遍歷的序列。數字間以1個空格分隔,行首尾不得有多餘空格。

7

2 3 1 5 7 6 4

1 2 3 4 5 6 7

4 1 6 3 5 7 2
根據這個題分別來了解一下根據前序遍歷和中序遍歷 或後序遍歷和中序遍歷來重新建立二叉樹。

前序遍歷:根左右

中序遍歷:左根右

後序遍歷:左右根

按照例題中的資料來簡單說明一下;

後序: 2 3 1 5 7 6 4

中序:1 2 3 4 5 6 7

因為後序遍歷最後遍歷到 根節點,所以我們倒著找,首先找到4,4就是我們所要構建數的根節點。然後在中序遍歷中找到4的位置,在 中序遍歷中可以把節點分成4的左右子樹。可以求得左子樹的節點個數為3個,然後接著在左子樹中找左子樹的根節點。因為後序遍歷的規則是左右根所以和根節點挨著的先是右子樹的 節點數。所以在左子樹中的所有節點 中找到左子樹的根節點,我們需要遞迴build(lm,p-1,lb,lb+k-1),同理 求右子樹的根節點build(p+1,rm,lf+k+1,rf)。

樹的層次遍歷, 直接上bfs即可。

//根據後序遍歷和前序遍歷進行重建二叉樹

#include#include#include#include#include#includeusing namespace std;

const int n=1010;

struct node

a[n];

int b[n],m[n];

int build(int lm,int rm,int lb,int rb)//lm,rm表示中序遍歷,lb,rb表示後序遍歷

void bfs(int x)

cout<#include#include#include#include#includeusing namespace std;

struct node

a[1010];

int f[1010],m[1010];

int build(int lm,int rm,int lf,int rf)//lm,rm中序遍歷;lf,rf前序遍歷

void bfs(int x)

for(int i=0;i}int main()

return 0;}/*

前序: 4 1 3 2 6 5 7

中序: 1 2 3 4 5 6 7

後序: 2 3 1 5 7 6 4

層次遍歷:4 1 6 3 5 7 2

*/

根據前中後序序列建立二叉樹

include include include include include define elemtype char typedef struct bintreenode bintreenode typedef bintreenode bintree bintree bintreecreate ...

重構二叉樹 根據前序和中序

重構二叉樹.cpp 定義控制台應用程式的入口點。include stdafx.h include iostream include stdlib.h include stdio.h include string.h using namespace std int i,j struct binaryn...

重建二叉樹,根據前序中序遍歷構建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序遍歷 根左右 中序遍歷 左根右 根據前序遍歷我們可以知道根節點,根據中序遍歷我們可以知道根節點的左右子樹結點有哪些。如 前序 中...