二叉树删除子树 (题目分析+C++代码实现)

二叉树删除子树

题目要求

编写程序对给定二叉树执行若干次删除子树操作,输出每次删除子树后剩余二叉树的中根序列。二叉树结点的数据域值为不等于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 

题目分析

要点1:根据先根序列创建二叉树

先根遍历的思想出发创建二叉树

cpp 复制代码
//先根序列创建二叉树
BTNode* CreateBT() {
	int a;
	cin >> a;
	BTNode* t;
	if (a == 0) {
		return NULL;  //若为0则为空指针
	}
	else {
		t = new BTNode;
		t->data = a;  //创建结点
	}
	t->left = CreateBT();  //递归左节点
	t->right = CreateBT();  //递归右结点
	return t;
}

要点2:删除数据域为k的结点p为根的子树

先要查找到数据域为k的结点p;

结合递归释放二叉树,删除以结点p为根的子树还包括其左右子树;

同时,注意还要修改该结点p的父结点,将其父结点指向该结点p的指针置为空

查找结点

先根遍历思想,找到数据域为k的结点

cpp 复制代码
//查找结点
BTNode* Find(BTNode* root,int k) {
	BTNode* q;
	if (root == NULL) return NULL;
	if (root->data == k) {
		q = root;
		return q;
	}
	q = Find(root->left, k);
	if (q != NULL) return q;
	q = Find(root->right, k);
}
释放二叉树

递归释放结点及其左右子树

cpp 复制代码
//释放二叉树
void Del(BTNode* p) {
	if (p == NULL) return;
	Del(p->left);  //递归释放左右子树
	Del(p->right);
	delete(p);  //释放内存
}
查找给定结点的父亲
cpp 复制代码
//查找给定结点的父亲
BTNode* father(BTNode* root, BTNode* p) {
	BTNode* q;
	if (root == NULL || p == NULL) return NULL;
	if (root->left == p || root->right == p) {
		q = root;
		return q;
	}
	BTNode* ql;
	ql = father(root->left, p);
	if (ql != NULL) return ql;
	q = father(root->right, p);
	return q;
}
删除子树
cpp 复制代码
//删除子树
void delSubTree(BTNode* root, BTNode* p) {
	if (root == NULL || p == NULL) return;  //指针为空,直接返回
	if (p == root) {
		Del(p);
		root = NULL;
		return;
	}
	BTNode* q=father(root,p);  //找到结点p的父结点
	if (q->left == p) q->left = NULL;  //p为q的左儿子,将左指针置空
	if (q->right == p) q->right = NULL;  //p为q的右儿子,将右指针置空
	Del(p);  //删除p及其子树
}

完整代码

cpp 复制代码
#include <iostream>
using namespace std;

typedef struct BTNode {
	int data;
	BTNode* left;
	BTNode* right;
}BTNode;

//先根序列创建二叉树
BTNode* CreateBT() {
	int a;
	cin >> a;
	BTNode* t;
	if (a == 0) {
		return NULL;  //若为0则为空指针
	}
	else {
		t = new BTNode;
		t->data = a;  //创建结点
	}
	t->left = CreateBT();  //递归左节点
	t->right = CreateBT();  //递归右结点
	return t;
}

//查找给定结点的父亲
BTNode* father(BTNode* root, BTNode* p) {
	BTNode* q;
	if (root == NULL || p == NULL) return NULL;
	if (root->left == p || root->right == p) {
		q = root;
		return q;
	}
	BTNode* ql;
	ql = father(root->left, p);
	if (ql != NULL) return ql;
	q = father(root->right, p);
	return q;
}

//释放二叉树
void Del(BTNode* p) {
	if (p == NULL) return;
	Del(p->left);  //递归释放左右子树
	Del(p->right);
	delete(p);  //释放内存
}

//删除子树
void delSubTree(BTNode* root, BTNode* p) {
	if (root == NULL || p == NULL) return;  //指针为空,直接返回
	if (p == root) {
		Del(p);
		root = NULL;
		return;
	}
	BTNode* q=father(root,p);  //找到结点p的父结点
	if (q->left == p) q->left = NULL;  //p为q的左儿子,将左指针置空
	if (q->right == p) q->right = NULL;  //p为q的右儿子,将右指针置空
	Del(p);  //删除p及其子树
}

//查找结点
BTNode* Find(BTNode* root,int k) {
	BTNode* q;
	if (root == NULL) return NULL;
	if (root->data == k) {
		q = root;
		return q;
	}
	q = Find(root->left, k);
	if (q != NULL) return q;
	q = Find(root->right, k);
	return q;
}

//中根遍历输出二叉树
void InOrder(BTNode* root) {
	if (root == NULL) return;
	InOrder(root->left);
	cout << root->data << ' ';
	InOrder(root->right);
}

int main() {
	BTNode* root=CreateBT();
	int m;  //操作数
	cin >> m;
	while (m--) {
		int k;
		cin >> k;
		BTNode* p = Find(root, k);
		if (p == NULL) cout << '0' << endl;  //若要删除的子树不在当前二叉树中,则该行输出0
		else {
			delSubTree(root, p);  //删除子树
			InOrder(root);  //中根序列遍历输出
			cout << endl;
		}
	}
	return 0;
}

提交结果

相关推荐
木心月转码ing1 小时前
Hot100-Day24-T128最长连续序列
算法
小肥柴1 小时前
A2UI:面向 Agent 的声明式 UI 协议(三):相关概念和技术架构
算法
学高数就犯困4 小时前
性能优化:LRU缓存(清晰易懂带图解)
算法
CoovallyAIHub7 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub7 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub8 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
颜酱19 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
zone77391 天前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub1 天前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉