巨斧砍大樹

2021-10-10 14:10:08 字數 1502 閱讀 4143

description

阿福最近練就了乙個新的招式:巨斧砍大樹。這個招式可以砍掉一顆二叉搜尋樹的某個子樹。現在,阿福面前有一顆 nn 個結點的二叉搜尋樹,他要使用 mm 次招式,於是他想詢問你每次使用「巨斧砍大樹」後二叉搜尋樹會被砍成什麼樣子。

二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;它的左、右子樹也分別為二叉搜尋樹。

input

第一行輸入 22 個整數 nn, mm (1 \leqslant n, m \leqslant 10)(1⩽n,m⩽10)。表示二叉搜尋樹的結點個數和招式使用次數。

第二行輸入 nn 個空格隔開的整數 vv (1 \leqslant v \leqslant 10)(1⩽v⩽10),表示二叉搜尋樹是以此序列順序插入生成的二叉樹(保證互不相同)。

接下來輸入 mm 行,每行乙個整數 ww (1 \leqslant w \leqslant 10)(1⩽w⩽10),表示阿福要砍掉結點上數值為 ww 的子樹(保證 ww 是初始二叉樹上存在的數值)。

output

對於每次砍樹,如果成功砍掉子樹,則先輸出一行 cut x,其中 xx 為被砍掉子樹的根節點上的數值。如果要砍掉的結點在之前已被砍掉,則輸出一行 already cut x,xx 的含義同上。

隨後輸出一行,表示此次砍樹結束後當前二叉樹的中序遍歷結果,以空格分隔(行末沒有多餘空格,如果整顆二叉樹已為空,則輸出一行空行)。

sample

input

5 51 3 2 4 552

341output

cut 5

1 2 3 4

cut 2

1 3 4

cut 3

1already cut 4

1cut 1

#include

#include

struct node

;struct node *

creat

(struct node *root,

int x)

//建立搜尋樹

else

return root;};

struct node *

cut(

struct node *root,

int x)

//砍樹

else

if(xdata)

root->left=

cut(root->left,x)

;else

root->right=

cut(root->right,x);}

return root;};

int flag;

void

midshow

(struct node *root)

//遍歷輸出

}int

main()

while

(m--

)}