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--
)}