以二叉链表为存储结构,在二叉树中删除以值x为根结点的子树

文章讲述了如何根据给定的扩展二叉树前序序列构建二叉树,并在删除特定节点后,输出删除后的前序和中序遍历序列。涉及`BiTree`类的`searchDel`,`delSubTree`,`release`等方法实现。
摘要由CSDN通过智能技术生成

【问题描述】

首先输入扩展二叉树的前序序列,构建二叉树,然后输入希望删除的节点,输出删除后二叉树的前序和中序遍历序列。

【输入形式】 输入扩展二叉树的前序序列。

【输出形式】 分两行分别输出删除后二叉树的前序和中序遍历序列。

【样例输入】

ab##cd##e## c

【样例输出】

删除后.........

前序遍历:ab

中序遍历:ba

【样例说明】 上述输入对应以下结构的二叉树:

 a

/
b c

  /
 d e

删除以c为节点的子树后,得到下图的子树:

 a

/
b

【思路】

先判断根节点是否需要删除,需要的话就用release删除,不需要的话就检查其左右子树是否需要删除,左右子树调用delSubTree函数删除。

【题解代码】

#include<iostream>
using namespace std;

struct BiNode {
	char data;
	BiNode* lchild, * rchild;
};
class BiTree
{
private:
	BiNode* root;
	char x;
public:
	
	BiTree(){ root = creat(root); }
	~BiTree() {
	}
	BiNode* getRoot() { return root; }
	void searchDel(BiNode *bt, char x);//检查根结点
	void delSubTree(BiNode* bt, char x);//查找并删除结点
	void release(BiNode* bt);//释放树结点
	BiNode* creat(BiNode* bt);
	void preOrder(BiNode* bt);
	void inOrder(BiNode* bt);
	char getX() {  //输入要删除的结点
		cin >> x;
		return x;
	}
};
//创建二叉树
BiNode* BiTree::creat(BiNode* bt)
{
	char ch;
	cin >> ch;
	if (ch == '#')
	{
		bt = NULL;
	}
	else
	{
		bt = new BiNode;
		bt->data = ch;
		bt->lchild = creat(bt->lchild);
		bt->rchild = creat(bt->rchild);
	}
	return bt;
}

//检查根节点
void BiTree::searchDel(BiNode *bt, char x)
{
	if (bt == NULL)
		return;
	if (bt->data == x)//如果根节点就是要找的结点,直接release根节点,再将根节点赋为空
	{
		release(bt);
		root = NULL;
	}
	else//其他情况再调用delSubTree函数进行查找和删除
	{
		delSubTree(bt, x);
	}
}
//查找并删除结点
void BiTree::delSubTree(BiNode* bt, char x)
{
	if (bt == NULL)
		return;
	else
	{
		//左子树不为空,并且左子树就是要找的结点,删除左子树,再将左子树赋为空
		if (bt->lchild && bt->lchild->data == x)
		{
			release(bt->lchild);
			bt->lchild = NULL;
		}
		//右子树不为空,并且右子树就是要找的结点,删除右子树,再将右子树赋为空
		if (bt->rchild && bt->rchild->data == x)
		{
			release(bt->rchild);
			bt->rchild = NULL;
		}
		//继续递归查找
		delSubTree(bt->lchild, x);
		delSubTree(bt->rchild, x);

	}
}

void BiTree::release(BiNode* bt)
{
	if (bt != NULL)
	{
		release(bt->lchild);
		release(bt->rchild);
		delete bt;
	}
}
//前序遍历
void BiTree::preOrder(BiNode* bt)
{
	if (bt == NULL)
	{
		return;
	}
	cout << bt->data;
	preOrder(bt->lchild);
	preOrder(bt->rchild);
}
//中序遍历
void BiTree::inOrder(BiNode* bt) {
	if (bt == NULL) {
		return;
	}
	else {
		inOrder(bt->lchild);
		cout << bt->data;
		inOrder(bt->rchild);
	}
}
int main()
{
	BiTree tree;
	tree.searchDel(tree.getRoot(), tree.getX());
	cout << "删除后……" << endl;
	cout << "前序遍历:";
	tree.preOrder(tree.getRoot());
	cout << "\n中序遍历:";
	tree.inOrder(tree.getRoot());
	return 0;

}

【运行结果】

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值