编写程序对给定二叉树执行若干次删除子树操作,输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于0的整数。每次删除操作是在上一次删除操作后剩下的二叉树上执行。
输入格式:
输入第1行为一组用空格间隔的整数,表示带空指针信息的二叉树先根序列,其中空指针信息用0表示。例如1 5 8 0 0 0 6 0 0表示如下图的二叉树。第2行为整数m,表示要进行的删除操作次数。接下来m行,每行一个不等于0的整数K,表示要删除以K为根的子树。m不超过100,二叉树结点个数不超过5000。输入数据保证各结点数据值互不相等,且删除子树后二叉树不为空。
输出格式:
输出为m行,每行为一组整数,表示执行删除操作后剩余二叉树的中根序列(中根序列中每个整数后一个空格)。若要删除的子树不在当前二叉树中,则该行输出0(0后无空格)。
输入样例:
1 5 8 0 0 0 6 0 0
3
5
8
6
结尾无空行
输出样例:
1 6
0
1
结尾无空行
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct TNode* Position;
typedef Position BinTree;
struct TNode {
int Data;
BinTree Left;
BinTree Right;
BinTree Father;
};
int arr1[100][5000];
int arr2[100];
int j, flag;
void CreatBinTree(BinTree* BT) {
int val;
scanf("%d", &val);
if (val == 0)*BT == NULL;
else {
(*BT) = (BinTree)malloc(sizeof(TNode));
(*BT)->Left = (*BT)->Right = NULL;
(*BT)->Father = NULL;
(*BT)->Data = val;
CreatBinTree(&(*BT)->Left);
CreatBinTree(&(*BT)->Right);
}
}
void Create(BinTree BT) {
if (BT->Left != NULL) {
BT->Left->Father = BT;
Create(BT->Left);
}
if (BT->Right != NULL) {
BT->Right->Father = BT;
Create(BT->Left);
}
}
void InorderTraversal(BinTree BT,int i) {
if (BT != NULL) {
InorderTraversal(BT->Left,i);
arr1[i][j] = BT->Data;
j++;
InorderTraversal(BT->Right,i);
}
}
void Delete(BinTree BT, int X) {
if (BT == NULL) {
return;
}
if (BT->Data == X) {
if (BT->Father == NULL) {
BT == NULL;
return;
}
if (BT->Father->Left != NULL && BT->Father->Left->Data == X) {
flag = 1;
BT->Father->Left = NULL;
return;//继续寻找与X值相同的节点
}
else {
flag = 1;
BT->Father->Right = NULL;
return;//继续寻找与X值相同的节点
}
}
Delete(BT->Left, X);
Delete(BT->Right, X);
}
int main() {
int n, i, x, l;
BinTree BT;
BT = (BinTree)malloc(sizeof(TNode));
CreatBinTree(&BT);
Create(BT);
scanf("%d", &n);
if (n > 100)return 0;
for (i = 0; i < n; i++) {
scanf("%d", &x);
flag = 0;
Delete(BT, x);
if (flag == 1) {
j = 0;
InorderTraversal(BT, i);
arr2[i] = j;
}
else {
arr2[i] = 1;
arr1[i][0] = 0;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < arr2[i]; j++) {
if (arr1[i][j] == 0)
printf("0");
else
printf("%d ", arr1[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}