【数据结构】(二叉树)二叉树删除结点值为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;
			}
		}
	}
}

二级指针的解释
【数据结构】(二叉树)二叉树删除结点值为x的子树_第1张图片
测试数据:

	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);

测试结果
【数据结构】(二叉树)二叉树删除结点值为x的子树_第2张图片

你可能感兴趣的:(数据结构【树】)