采用递归删除值为x的结点及其子树

程序要求

假设二叉树中的结点为单个字符,且均不相等,采用二叉链存储,设计递归算法删除值为x的结点并删除该子树。

函数设计

(1)	void CreatBiTNode(BiTNode * &b,char * str)
	//从字符串创建二叉树
(2)	void PrintBiTNode(BiTNode *b)
	//输出二叉树
(3)	void FreeBiTNode(BiTNode *&b)
	//删除二叉树中的节点
(4)	bool SearchBiTNode(BiTNode *&b,char Del)
	//查找二叉树中的节点
(5)	void main()
	//主函数

二叉树的类型定义

typedef struct BiTNode{
    		char data;//节点数据
    		struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode;

完整代码

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef struct BiTNode{
    char data;//数据
    struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode;
void CreatBiTNode(BiTNode * &b,char * str)
{
	//从str中建立二叉链表
	BiTNode *Temp[MAXSIZE],*p = NULL;//开辟临时二叉树和临时节点空间
	int top = -1,k,j = 0;
	char ch;
	b = NULL;//初始化二叉树为空
	ch = str[j];
	while(ch != '\0')
	{
		switch(ch)
		{
			case '(': //遇到该节点的左节点
				top++;
				Temp[top] = p;
				k = 1;
				break;
			case ')'://该节点子树创建完成
				top--;
break;
			case ','://遇到该节点的右子节点
				k = 2;break;
			default :
				p = (BiTNode *)malloc(sizeof(BiTNode));
				p -> data = ch;
				p -> lchild = p -> rchild = NULL;
				if(b == NULL)
					b = p;//该节点为二叉树的根节点
				else
				{
					if(k == 1)
						Temp[top] -> lchild = p;//左节点入临时二叉树
					else if(k == 2)
						Temp[top] -> rchild = p;//右节点入临时二叉树
				}
		}
		j++;
		ch = str[j];//节点入树
	}
}
void PrintBiTNode(BiTNode *b)
{
	//输出二叉树
	if(b != NULL)
	{
		printf("%c",b -> data);//先输出根节点
		if(b -> lchild != NULL || b -> rchild != NULL)
		{
			//有孩子时输出孩子
			printf("(");
			PrintBiTNode(b -> lchild);//递归输出左孩子
			if(b -> rchild != NULL)
			{
				printf(",");//有右孩子时输出
				PrintBiTNode(b -> rchild);//递归输出右孩子
			}
			printf(")");//孩子输出结束
		}
	}
}
void FreeBiTNode(BiTNode *&b)
{
	//删除节点及其子节点
	if(b != NULL)
	{
		FreeBiTNode(b -> lchild);//递归删除左子树
		FreeBiTNode(b -> rchild);//递归删除右子树
		free(b);//释放根节点空间
		b = NULL;//删除节点后设置指针悬空,否则会发生错误!!!
	}
}

bool SearchBiTNode(BiTNode *&b,char Del)
{
	//查找节点值为Del的节点
	if(b == NULL)
		return false;//树为空,找不到该节点,返回false
	if(b -> data == Del)
	{
		FreeBiTNode(b);//找到要删除的节点,调用删除函数将其删除
		printf("找到该节点,删除成功!\n");
		return true;//找到该节点,返回true
	}
	else if(SearchBiTNode(b -> lchild,Del))
		return true;//递归查找其左子树,找到节点,返回true		
	else if(SearchBiTNode(b -> rchild,Del))
		return true;//递归查找其右子树,找到节点,返回true
	else
		return false;
}
void main()
{
	//主函数
	BiTNode *b;//定义二叉树
	char Del;//定义要删除子树的值
	char str[MAXSIZE];
	printf("请输入二叉树:\n");
	scanf("%s",&str);
	CreatBiTNode(b,str);//创建二叉树
	printf("二叉树创建成功!\n");
	PrintBiTNode(b);//输出二叉树
	printf("\n");
	printf("请输入要删除节点的值:\n");
	fflush(stdin);//清空缓冲区
	scanf("%c",&Del);
	if(SearchBiTNode(b,Del))//删除成功会返回true
		PrintBiTNode(b);//输出删除后的二叉树
	else if(SearchBiTNode(b,Del) == false) //删除失败会返回falase
		printf("未查找到节点,删除失败!\n");
	printf("\n");
}

测试数据

输入的二叉树
处理后的二叉树

运行示例

运行截图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值