删除二叉树中以x为根节点的子树(包括根结点)

已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删除以它为根的子树,并释放相应的空间。

思想:

删除二叉树采用后序遍历。先删除左子树,然后右子树,最后根。

利用层次遍历来删除所有以x为根结点的子树,并利用队列来进行辅助。不为x,则左右孩子入队,否则删除。直到队列为空。

代码:

void DeleteBTree(BTree T){
	//删除二叉树,后序遍历 
	if(T!=NULL){
		DeleteBTree(T->lchild);//删除左子树 
		DeleteBTree(T->rchild);//删除右子树 
		free(T);//删除根结点 
	}
} 

//删除树中所有根为X的子树
void DeleteAllX(BTree T,TElemType x){
	if(T==NULL) return;//空树 
	if(T->data==x){//根结点为X,删除整棵树 
		DeleteBTree(T);
		T=NULL;
		return;	
	}
	
	//初始化队列 
	SqQueue queue;
	initQueue(queue); 
	BTree p;//定义一个辅助指针p
	
	enQueue(queue,T);//根结点入队
	
	//队列不为空时,队列中的第一个元素出队,并判断孩子是否为x
	//不为x则进对,为x则删除以此结点为根结点的子树 
	while(!queueEmpty(queue)){
		deQueue(queue,p);//出队 
		if(p->lchild != NULL){//做孩子 
			if(p->lchild->data == x){
				DeleteBTree(p->lchild);//删除 
				p->lchild = NULL
			}else{
				enQueue(queue,p->lchild);//入队 
			}
		} 
		
		if(p->rchild != NULL){//右孩子 
			if(p->rchild->data == x) {
				DeleteBTree(p->rchild);//删除 
				p->rchild = NULL
			}else{
				enQueue(queue,p->rchild);//入队 
			}
		} 
	} 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值