【数据结构】(二叉树)二叉树删除结点值为x的子树

删除结点值为x的子树(包含结点本身)

方法一递归:

算法思想: 递归的思想就是在前序遍历的过程中查找值为x的元素找到后将其释放


void Release(BiTree *&T){
	if(!T)
		return;
	Release(T->lchild);
	Release(T->rchild);
	free(T);
}

void Delete_X(BiTree *&T,char x){
	if(T==NULL)
		return;

	if(T->data==x){       //若T的data为想要删除的元素 则进行删除
			Release(T);   //删除包括根节点
			T=NULL;		//因为free只是告诉系统这块内存我们不用了而不是物
						//理上面的释放所以我们要手动赋值NULL;
	}
	if(T!=NULL){		 //这里再次进行一次判断当T不为空时继续向下执行
		Delete_X(T->lchild, x);
		Delete_X(T->rchild, x);
	}
}

方法二层次遍历非递归:

算法思想: 因为层次遍历容易寻找跟结点我们在层次遍历中寻找要删除的元素x并递归删除它.层次遍历中我使用了二级指针因我在一级指针测试中本没有成功 这里如果有问题还请各位大佬指正

void Delete_X2(BiTree *&T,char x){			//层次遍历非递归删除
	if(!T)
		return ;

	BiTree **r;
	BiTree **que[MaxSize];      //数组模拟队列
	int front=-1,rear=-1;	  //队列指针
	que[++rear]=&T;			//根节点入队
	
	while(front<rear){    //队列不为空循环继续
		r=que[++front];
		if((*r)->data==x){
			Release(*r);
			*r=NULL;
		}else{
			if((*r)->lchild){
				que[++rear]=&(*r)->lchild;
			}
			if((*r)->rchild){
				que[++rear]=&(*r)->rchild;
			}
		}
	}
}

二级指针的解释
在这里插入图片描述
测试数据:

	char pre[13]={'#','A','B','D','F','H','J','M','N','C','E','K','G'};
	char in[13]={'#','D','B','J','H','M','N','F','A','E','K','C','G'};
	
	BiTree *p=PreInCreate(pre,in,1,12,1,12);
	preorder(p);
	cout<<endl;
	Delete_X2(p,'B');
	preorder(p);

测试结果
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值