当前位置:编程学堂 > 巨斧砍大树

巨斧砍大树

  • 发布:2023-09-30 07:15

巨斧砍大树

描述
阿福最近掌握了一个新动作:用巨斧砍大树。这一举动可以砍掉二叉搜索树的某个子树。现在,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 midshowstruct节点*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") ;}
}

相关文章

最新资讯