给出一棵二叉搜索树(没有相同元素), 请输出其删除部分元素之后的层序遍历序列。
删除结点的策略如下:
- 如果一个结点是叶子结点,则直接删除;
- 如果一个结点的左子树不为空, 则将该结点的值设置为其左子树上各结点中的最大值,并继续删除其左子树上拥有最大值的结点;
- 如果一个结点的左子树为空但右子树不为空,则将该结点的值设置为其右子树上各结点中的最小值,并继续删除其右子树上拥有最小值的结点。
输入格式:
每个输入文件包含一个测试用例。每个测试用例的第一行包含一个整数 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
二叉搜索树(二叉排序树)的其他知识点以及操作(查找,遍历,插入等)可查看:
7-4 二叉搜索树的最近公共祖先 【题目解析】https://blog.csdn.net/qq_61351908/article/details/122620280
【含解析】
#include <iostream>
#include <stdlib.h>
#include <queue>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void bstInsert(BiTree &T,int data)
{
if(T==NULL){
T = (BiTree)malloc(sizeof(BiTNode));
T->data = data;
T->lchild = NULL;
T->rchild = NULL;
}else if(T->data == data)
return;
else if(data < T->data)
bstInsert(T->lchild,data);
else bstInsert(T->rchild,data);
}
void Delete(BiTree &p) //本题要拿左子树最大的数替换(也可拿右子树最小的替换[本题不可以,层序遍历])
{
BiTree q,s;
if(p->lchild==NULL)
{
q = p;
p = p->rchild;
free(q);
}else if(p->rchild==NULL)
{
q = p;
p = p->lchild;
free(q);
}else{
q = p;
s = p -> lchild;
while(s->rchild){
q = s;
s = s ->rchild;
}
p->data = s->data;
if(q!=p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
}
void bstDelete(BiTree &T,int data)
{
if(T){
if(T->data==data)
Delete(T);
else if(data < T->data)
bstDelete(T->lchild,data);
else bstDelete(T->rchild,data);
}
}
void LevelOrderTree(BiTree T)
{
BiTree q;
queue<BiTree> Q;
Q.push(T);
while(Q.empty()==0){
q = Q.front();
cout<<q->data<<" ";
Q.pop();
if(q->lchild!=NULL)
Q.push(q->lchild);
if(q->rchild!=NULL)
Q.push(q->rchild);
}
}
int main()
{
BiTree T = NULL;
int N,K,x;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>x;
bstInsert(T,x);
}
cin>>K;
for(int i=0;i<K;i++)
{
cin>>x;
bstDelete(T,x);
}
LevelOrderTree(T);
}