c语言实现递归删除二叉树的的子树

在这里插入图片描述

#include<stdio.h>
#include <stdlib.h>
typedef struct BiTNode{                //定义结点结构 
	char data;
	struct BiTNode *lchild,*rchild;    //指向左右孩子的指针 
}BiTNode,*BiTree;                    //命名结点类型名,和指向结点的指针类型 

void Release(BiTree &T){            //递归删除该结点及以下结点 
	if(T!=NULL){
	Release(T->lchild);
	Release(T->rchild);
	free(T);
	T=NULL;		//因为free只是告诉系统这块内存我们不用了而不是物(释放了该结点,不在连接到树上) 
						//理上面的释放所以我们要手动赋值NULL;  (虽然释放了该结点,但里面还有存放这值,这里置空) 
	}
}

void Delete_X(BiTree &T,char x){    //递归寻找要删除的结点 
	if(T==NULL)                    //1、树为空 
		return;
	
	if(T->data==x){       //2、若T的data为想要删除的元素 则进行删除
			Release(T);   //删除包括根节点
		
	}
	if(T!=NULL){		 //3、以上情况都不是,递归向左右孩子寻找 
		Delete_X(T->lchild, x);
		Delete_X(T->rchild, x);
	}

}
void CreateBiTree(BiTree &T){  //先序建立二叉树  
	char ch;
	scanf("%c",&ch);          
	if(ch=='#') T=NULL;      //#代表该结点为空 ,也就是父节点没有这个孩子结点 
	else
	{
		T=new BiTNode;
		T->data=ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}
void FirstTraver(BiTree T){  //先序遍历 
	if(T){
		printf("%c",T->data);
		FirstTraver(T->lchild);
		FirstTraver(T->rchild);
	}
} 

int main()
{
	BiTree T; 
	printf("请建立表:\n");
	
	CreateBiTree(T);
	char ch;                
    ch=getchar();        //接收输入数据后回车的影响 
//	BiTree K=T;
	FirstTraver(T);     //先序遍历创建的树 
	printf("\n");
	printf("请输入要删除的节点:\n");
	char del;
	scanf("%c",&del);
	Delete_X(T,del);      //删除该结点及其子树 
	FirstTraver(T);       //先序遍历删除后的结果 
	
}             

这里还有快捷的方式,就是不用递归删除子树,而是当找到要删除的结点时,修改该结点的指向左右孩子指针为NULL;这等于直接切掉了该子树。但该子树还是存在内存中。


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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值