描述
阿福最近掌握了一个新动作:用巨斧砍大树。这一举动可以砍掉二叉搜索树的某个子树。现在,Afu 有一棵二叉搜索树,前面有 nn 个节点。他要使用mm招式,所以他想问你每次使用“巨斧砍大树”时,二叉搜索树会是什么样子。 。
二叉搜索树要么是空树,要么是具有以下性质的二叉树:如果它的左子树不为空,那么左子树上所有节点的值都小于它的根的值节点 ;如果其右子树不为空,则右子树上所有节点的值都大于其根节点的值;它的左子树和右子树也分别是二叉搜索树。
输入
第一行输入 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),表示Afu要砍掉节点上值为ww的子树(保证ww是初始二叉树上存在的值)。
输出
对于每一次树切割,如果子树切割成功,会先输出一行Cut x,其中xx为切割子树根节点上的值。如果要切割的节点之前已经被切割过,则输出一行Already cut x,xx的含义同上。
然后输出一行,表示当前二叉树在树切割完成后的中序遍历结果,中间用空格分隔(行尾没有多余的空格,如果整个二叉树为空,输出一个空行)。
样本
输入
5 5
1 3 2 4 5
5
2 3
4
1
输出
剪切 5
1 2 3 4
已切 2
1 3 4
已切 3
1
已切 4
1
切 1
#包括
#包括
struct节点
{int数据;结构节点*左;结构体节点*右;
};
结构节点*创建(结构节点* root,int x)//建立搜索树{if(!根){根 =(结构体节点*)malloc(sizeof(struct节点));根- >数据=x;根->左 =NULL;根- >对=NULL;}否则{if( x<根->数据)root->左=创建(root->左,x);其他root->右=创建(根->右,x);}返回根;
};
结构节点*切割(结构节点* root,int x)//砍树{if(!root)printf() “已剪%d\n”, x);else{if(root-> 数据==x )//找到要剪切的节点并清空{printf("剪切%d\n",x );root=NULL;}否则 如果(x<根->数据)根->左= 切(根-> 左,x);其他根->右=切(根->右,x);} 返回根;
};
int旗帜;
void midshow(struct节点*root)//遍历输出{if(root){midshow() 根->左);if(标志==1)标志=0 ;elseprintf(" ");printf("%d",root-> 数据) ;中场(root->右);}
}
int 主(){inti,n,m ,x;scanf("%d %d",&n,&m) ;结构节点 *root;root=NULL;for(i=0;i<n;i++){scanf("%d", &x);根=创建(根,x);}同时(m--){scanf ("%d", &x);根=切(根,x);flag=1;midshow(root);printf("\n") ;}
}