给出一棵二叉搜索树(没有相同元素), 请输出其删除部分元素之后的层序遍历序列。
删除结点的策略如下:
- 如果一个结点是叶子结点,则直接删除;
- 如果一个结点的左子树不为空, 则将该结点的值设置为其左子树上各结点中的最大值,并继续删除其左子树上拥有最大值的结点;
- 如果一个结点的左子树为空但右子树不为空,则将该结点的值设置为其右子树上各结点中的最小值,并继续删除其右子树上拥有最小值的结点。
输入格式:
每个输入文件包含一个测试用例。每个测试用例的第一行包含一个整数 N (0<N<=100),表示二叉搜索树中结点的个数。
第二行给出该二叉搜索树的先序遍历序列,由 N 个整数构成,以一个空格分隔。第三行给出一个整数K (0<K<N),表示待删除的结点个数。最后一行给出 K 个整数,表示待删除的各个结点上的值。必须按输入次序删除结点。题目保证结点一定能被删除。
输出格式:
在一行中输出删除结点后的层序遍历序列。序列中的数字以一个空格分隔,行末不得有多余空格。
输入样例:
7
4 2 1 3 6 5 7
2
3 6
输出样例:
4 2 5 1 7
思路分析:
本题思路在于删除的操作,题目要求的删除操作有三种,不能只根据课本上的删除操作来进行得分
其他查找最大最小值,和插入操作都简单,还有个难点就在于如何层序遍历二叉树
ACAC!!
#include <stdio.h>
#include <stdlib.h>
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
int Data;
BinTree Left;
BinTree Right;
};
BinTree FindMin(BinTree BST){
if(BST!=NULL){
while(BST->Left)
BST = BST->Left;
}
return BST;
}
BinTree FindMax(BinTree BST){
if(BST!=NULL){
while(BST->Right)
BST = BST->Right;
}
return BST;
}
BinTree Insert( BinTree BST, int X )
{
if(!BST)
{
BST=(BinTree)malloc(sizeof(struct TNode));
BST->Data=X;
BST->Left=BST->Right=NULL;
}
else
{
if(X>BST->Data)
BST->Right=Insert(BST->Right,X);
else
if(X<BST->Data)
BST->Left=Insert(BST->Left,X);
}
return BST;
}
BinTree Delete( BinTree BST, int X )
{
BinTree temp;
if(!BST)
{
printf("未找到\n");
}
else
{
if(BST->Data<X)
{
BST->Right=Delete(BST->Right,X);
}
else if(BST->Data>X)
{
BST->Left=Delete(BST->Left,X);
}
else
{
if(!BST->Left&&!BST->Right)
{
temp=BST;
BST=BST->Right;
free(temp);
}
else{
if(BST->Left)
{
temp=FindMax(BST->Left);
BST->Data=temp->Data;
BST->Left=Delete(BST->Left,BST->Data);
}
else
if(BST->Right)
{
temp=FindMin(BST->Right);
BST->Data=temp->Data;
BST->Right=Delete(BST->Right,BST->Data);
}
}
}
}
return BST;
}
void LevelorderTraversal( BinTree BT )
{
int i=0;
int j=0;
int flag=0;
BinTree T;
BinTree F[1000];
if(BT)
{
F[i++]=BT;
while(j!=i)
{
T=F[j++];
if(flag==0){
printf("%d",T->Data);
flag=1;
}
else
printf(" %d",T->Data);
if(T->Left)
F[i++]=T->Left;
if(T->Right)
F[i++]=T->Right;
}
}
}
int main()
{
BinTree BT=NULL;
int X;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d",&X);
BT = Insert(BT,X);
}
scanf("%d",&n);
while(n--)
{
scanf("%d",&X);
BT = Delete(BT,X);
}
LevelorderTraversal(BT);
return 0;
}