天梯賽平時練習(關於二叉樹)

2021-10-10 19:24:37 字數 3186 閱讀 9035

由序列遍歷構建二叉樹的模板

#include

#include

#include

#include

#include

using

namespace std;

const

long

long maxn =

1e5+7;

typedef

long

long ll;

struct node

;int pre[maxn]

;//前序

int in[maxn]

;//中序

int bhd[maxn]

;//後序

由前中序遍歷生成二叉樹的模板

//前中序生成樹

node *

create_vlr_lvr

(int prel,

int prer,

int inl,

int inr)

int nodeleft=i-inl;

root-

>lchild=

create_vlr_lvr

(prel+

1,prel+nodeleft,inl,i-1)

; root-

>rchild=

create_vlr_lvr

(prel+nodeleft+

1,prer,i+

1,inr)

;return root;

}

由後序和中序的排序生成二叉樹

//後中序生成樹

node *

create_lrv_lvr

(int bhdl,

int bhdr,

int inl,

int inr)

int numright=inr-i;

root-

>lchild=

create_lrv_lvr

(bhdl,bhdr-

(numright+1)

,inl,i-1)

; root-

>rchild=

create_lrv_lvr

(bhdr-numright,bhdr-

1,i+

1,inr)

;return root;

}

前序遍歷輸出二叉樹

//前序輸出

void

printpre

(node* root)

中序遍歷輸出二叉樹

//中序輸出

void

printin

(node* root)

後序遍歷輸出二叉樹

//後序輸出

void

printbhd

(node* root)

層序輸出遍歷二叉樹

//層序輸出

int flag=0;

void

printcengxu

(node *bt)

7-28 樹的遍歷 (25分)

題解:套用兩個模板

後中遍歷生成樹+層序遍歷輸出樹

#include

#define ll long long

#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using

namespace std;

const

long

long maxn =

1e5+7;

struct node

;int in[maxn]

;//中序

int bhd[maxn]

;//後序

//後中序生成樹

node *

create_lrv_lvr

(int bhdl,

int bhdr,

int inl,

int inr)

//i 是左子樹的長度

//numright-1 是右子樹的長度

int numright=inr-i;

//設定左指標的時候

//下一步再找左子樹的頭結點

//當這個左子樹全部遍歷完成之後才會返回一開始就定下的那個頭結點

root-

>lchild=

create_lrv_lvr

(bhdl,bhdr-

(numright+1)

,inl,i-1)

;//後序遍歷的陣列中減掉右子樹的長度,從下標為0處開始

//中序遍歷的陣列傳入時只從頭開始傳到左子樹的長度

root-

>rchild=

create_lrv_lvr

(bhdr-numright,bhdr-

1,i+

1,inr)

;//後序遍歷的陣列

//尾部減掉右子樹的長度到尾(最後乙個數)減一

//相當於傳入了乙個右子樹

//中序遍歷

//從找到那個根節點處開始一直到後面都是右子樹

return root;

//所有遞迴都結束之後才會最後返回乙個值

//是最頭的頭結點

}//層序遍歷函式

void

leveorder

(node* root)

q[++rear]

=root;

int falg=0;

while

(front!=rear)

else

if(q-

>lchild!=

null)if

(q->rchild!=

null)}

}int

main()

for(

int i=

0;i) node* root=

create_lrv_lvr(0

, n-1,

0, n-1)

;leveorder

(root)

;}

團體程式設計天梯賽 玩轉二叉樹

題意 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字...

玩轉二叉樹(天梯賽L2)

給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其中序遍歷序列。第三行給出其前序遍歷序列。數字間以空...

還原二叉樹(天梯賽L2)

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。輸入格式 輸入首先給出正整數n 50 為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為n的不包含重複英文本母 區別大小寫 的字串。輸出格式 輸出為乙個整數,即該二叉樹的高度。輸入樣例 9abdfghiec fdhgib...