删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。(C语言)

news2024/11/17 12:48:49

目录

实验内容:

实验过程:

1.算法设计

2.程序清单

3.复杂度分析

4.运行结果


实验内容

删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。

实验过程

1.算法设计

设计了一个基于字符输入表达式来创建、打印和删除二叉树节点的功能。主要算法设计过程为:

  • 创建二叉树:

1.输入一个字符串,其中包含括号、逗号以及代表节点值的字符。

2.通过遍历字符串,根据字符类型执行相应的操作当遇到'('时,表示进入新的子树,将当前父节点压入栈中并标记即将创建的是左子树;当遇到')'时,表示子树创建完成,弹出栈顶元素;当遇到','时,表示开始创建当前节点的右子树;对于其它字符(即节点值),创建一个新的二叉树节点,并根据当前状态将其链接到相应父节点的左或右子节点。

  • 打印二叉树:使用递归方法,从根节点开始,按照先序遍历的方式打印节点值及括号以表示子树结构。
  • 删除节点及其子节点:从给定的根节点开始递归地释放所有子节点和根节点的内存。
  • 查找并删除指定值节点:定义一个递归函数SearchBiTNode,它在二叉树中查找具有指定值的节点。在查找过程中,当找到目标节点时,调用FreeBiTNode函数删除该节点,并返回true表示删除成功。如果在递归查找过程中没有找到目标节点,则返回false。

主函数流程:创建二叉树,打印创建好的二叉树。输入要删除的节点值,然后进行查找和删除操作。在删除成功的情况下再次打印删除节点后的二叉树。

2.程序清单

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

//定义二叉树节点结构体
typedef struct BiTNode{
    char data;
    struct BiTNode *lchild, *rchild;
} BiTNode;

//从给定字符串str中创建二叉链表
void CreatBiTNode(BiTNode * &b,char * str)
{	
	//定义BiTNode指针数组Temp,初始化一个指向BiTNode结构体的指针变量p
	BiTNode *Temp[MAXSIZE],*p = NULL;
	//栈顶指针,记录当前正在处理的子树的父节点
	int top = -1;
    int k;
	int j=0;
	char ch=str[j];

	//初始化二叉树为空
	b = NULL;

	while(ch != '\0')
	{
		switch(ch)
		{
			case '(': //遇到(,表示进入新的子树,栈顶指针+1,该节点压入栈中
				top++;
				Temp[top] = p;
				k = 1;//该节点的左子树
				break;

			case ')'://子树创建成功,栈顶指针-1
				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;
	}
}

//查找节点值为Del的节点
bool SearchBiTNode(BiTNode *&b,char Del)
{
	if(b == NULL)
		return false;//树为空,找不到该节点,返回false
	if(b -> data == Del)
	{
		FreeBiTNode(b);//找到要删除的节点,调用删除函数将其删除
		printf("找到该节点,删除成功!\n");
		return 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)){
		//输出删除后的二叉树
		PrintBiTNode(b);
	}else if(SearchBiTNode(b,Del) == false){
		printf("未查找到节点,删除失败!\n");
	}
	printf("\n");
}

3.复杂度分析

(1)时间复杂度

1.创建二叉树函数(CreatBiTNode 函数):时间复杂度O(n),n为输入字符串的长度。因为需要遍历整个字符串来构建二叉树。

2.打印二叉树函数(PrintBiTNode 函数):时间复杂度O(h),h为二叉树的高度,对于完全二叉树或满二叉树,其高度h接近于节点数n的对数,即h ≈ log_2(n)。

3.删除节点及其子节点函数(FreeBiTNode 函数):时间复杂度 O(n)。在二叉链表中,每个节点最多被访问一次。对于高度为h的二叉链表,其最坏时间复杂度为O(2^h),其中h是树的高度。对于完全二叉树或满二叉树,其高度h接近于节点数n的对数,即h ≈ log_2(n),此时时间复杂度为O(2^(log_2(n))) = O(n)。对于非完全二叉树,实际时间复杂度可能会略小于O(n)。

4.查找并删除节点函数(SearchBiTNode 函数):时间复杂度O(n),同时FreeBiTNode 函数一样。最坏的情况需要遍历整个二叉树。

(2)空间复杂度

1.创建二叉树函数(CreatBiTNode 函数):空间复杂度:代码中使用了一个大小为MAXSIZE的数组Temp作为辅助栈。在最坏情况下(输入字符串表示一个完全二叉树时),栈中最多会存放log_2(n)个节点指针(n为二叉链表的节点数)。但由于MAXSIZE是固定常数,这部分空间消耗可以认为是常数级别的。因此,这段代码的空间复杂度为O(1)

2.打印二叉树函数(PrintBiTNode 函数):空间复杂度:递归调用会占用一定的栈空间,最坏情况下,当二叉树完全不平衡时,递归深度达到 h,因此空间复杂度为 O(h)。

3.删除节点及其子节点函数(FreeBiTNode 函数):空间复杂度:同 PrintBiTNode 函数,递归调用也需要栈空间,最坏情况下的空间复杂度为 O(h)。

4.查找并删除节点函数(SearchBiTNode 函数):空间复杂度:同 PrintBiTNode 和 FreeBiTNode 函数,由于也是采用递归实现,最坏情况下的空间复杂度为 O(h)。

4.运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端(简洁版)

0. 开发环境 && 安装插件 这里我使用的是vscode开发环境 Auto Rename Tag是语法自动补齐view-in-browser是快速在浏览器中打开live server实时网页刷新 1. HTML 文件基本结构 <html><head><title>第一个页面</title></head><body&g…

PCIe系统阻抗控制85还是100的验证

高速先生成员--周伟 还记得上次的文章&#xff0c;PCIe阻抗控制&#xff0c;85ohm和100ohm哪个好&#xff0c;文章里面只讲到目前的主要问题&#xff0c;但没有给出具体怎么解决这个问题&#xff0c;今天我们就通过无源仿真的方式来聊聊上次那个问题的最终解决方案。 目前我们看…

lvgl图形化设计工具GUI Guider结合使用

前言 上篇博客整合了lvgl到项目中&#xff0c;采用的是自己编写源码的方式&#xff0c;实现了个简单的界面。实际过程中一般情况开发界面都借助设计工具&#xff0c;这里使用的是gui guider来进行示例记录 项目结构&#xff08;生成代码路径依然放到项目路径下&#xff09; C…

Hack The Box-Runner

总体思路 子域名扫描->CVE-2023-42793利用->获取敏感信息->user->端口转发->CVE-2024-21626利用->root 信息收集&端口利用 nmap -sSVC 10.10.11.13目标开放22、80、8000端口&#xff0c;这里先将runner.htb加入到hosts文件后&#xff0c;访问之 查看源…

腾讯后端一面:当 TCP 建立连接之后,TCP 和 UDP 的实时性是不是就差不多了?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面&#xff1a;当 TCP 建立连接之后&#xff0c;TCP 和 UDP 的实时性是不是就差不多了&#xff1f; 项目相关 面试官可能是 Go 方向的&#xff0c;我面试的是 Java 方向的&#xff0c;所以面试官也没有问我简历上的项…

信号继电器HBDXH-200/1辅助电源110VDC 启动电压110VDC JOSEF约瑟

用途 适用于直流操作的继电保护和自动控制线路中&#xff0c;作为信号指示用&#xff0c;有多组动合保持触点。满足现场指示和遥信要求。 技术参数 启动信号额定值:直流电流型:10mA~4A. 直流电压型:220VDC、110VDC、48VDC、24VDC 辅助电源电压:220VDC、110VDC、220VAC、110…

华为ensp中MSTP多网段传输协议(原理及配置命令)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月22日15点29分 在华为ENSP中&#xff0c;MSTP&#xff08;多段传输协议&#xff09;是重要的生成树协议&#xff0c;它扩展了STP&#xff08;生成树协议&#xff09…

舒适护眼模式:苹果手机字体大小怎么设置?

在现代社会&#xff0c;人们对于手机的使用已经不再局限于通讯和娱乐&#xff0c;也逐渐成为了我们生活和工作中不可或缺的一部分。然而&#xff0c;长时间使用手机可能会对我们的视力造成一定程度的影响。 为了更好地保护视力健康&#xff0c;苹果手机提供了舒适护眼的模式&a…

vue3项目使用<img :src=““ />动态加载图片

分享一下使用<img :src"" />动态加载图片时遇到的问题以及解决方法。 下面是部分页面代码&#xff0c;这里我使用了<img :src"itemc.headUrl" />来动态加载图片 这时遇到了问题&#xff0c;因为这里的itemc.headUrl是图片的相对路径&#xff…

戴尔电脑怎么关闭开机密码?

1.同时按键盘上是“window键”&#xff08;一般是键盘最下面一排第二个&#xff09;和“R键“&#xff0c;并在弹出的窗口输入“netplwiz”然后确定。 2.然后会弹出的“用户账户”窗口&#xff0c;接下来取消勾选“要使用本计算机&#xff0c;用户必须输入用户名和密码” 3.上面…

RK3568 学习笔记 : 更改 u-boot spl 中的 emmc 的启动次序

环境 开发板&#xff1a; 【正点原子】 的 RK3568 开发板 ATK-DLRK3568 u-boot 版本&#xff1a;来自 【正点原子】 的 RK3568 开发板 Linux SDK&#xff0c;单独复制出来一份&#xff0c;手动编译 编译环境&#xff1a;VMware 虚拟机 ubuntu 20.04 问题描述 RK3568 默认 …

Automated CNN approach

图1有点简单 作者未提供代码

Linux 内核设备树 ranges属性

今天有人问了我一下ranges属性&#xff0c;找了相关资料确认后&#xff0c;记录一下&#xff1a; 参考资料链接&#xff1a;让你完全理解linux内核设备树ranges属性地址转换 - vkang - 博客园 (cnblogs.com) ranges属性定义如下&#xff1a; ranges < local_address pa…

学习笔记:Vue3(图片明天处理)

文章目录 1.概述1.1定义1.2特性1.3组合式API 2.基本用例-项目搭建3.项目目录介绍3.1概述3.2查看文件 4.组合式API4.1概述4.2新的API风格4.2.1概述4.2.2写法4.2.3基本用例-Setup选项使用4.2.4基本用例-语法糖写法&#xff08;重点&#xff09;4.2.5执行时机4.2.6代码特点 4.3响应…

nodejs在控制台打印艺术字

const figlet require("figlet");figlet("SUCCESS", function (err, data) {if (err) {console.log("Something went wrong...");console.dir(err);return;}console.log(data);}); 参考链接&#xff1a; https://www.npmjs.com/package/figlet…

制造数字化“管理套路”

在当今竞争激烈的市场环境中&#xff0c;制造企业始终关心三个核心问题&#xff1a;生产效率、产品质量、成本控制&#xff0c;所以许多企业渴望加强对生产过程的管理控制。 生产过程是一个相对复杂的过程&#xff0c;涉及到多个环节和因素。从原材料的采购到产品的设计、生产…

【机器学习】各大模型原理简介

目录 ⛳️推荐 前言 一、神经网络&#xff08;联结主义&#xff09;类的模型 二、符号主义类的模型 三、决策树类的模型 四、概率类的模型 五、近邻类的模型 六、集成学习类的模型 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风…

一举颠覆Transformer!最新Mamba结合方案刷新多个SOTA,单张GPU即可处理140k

还记得前段时间爆火的Jamba吗&#xff1f; Jamba是世界上第一个生产级的Mamba大模型&#xff0c;它将基于结构化状态空间模型 (SSM) 的 Mamba 模型与 transformer 架构相结合&#xff0c;取两种架构之长&#xff0c;达到模型质量和效率兼得的效果。 在吞吐量和效率等关键衡量指…

去除图像周围的0像素,调整大小

在做分割任务时&#xff0c;经常需要处理图像&#xff0c;如果图像周围有一圈0像素&#xff0c;需要去除掉&#xff0c;重新调整大小 数组的处理 如果图像的最外一圈为0&#xff0c;我们将图像最外圈的图像0去除掉。 import numpy as npdef remove_outer_zeros(arr):# 获取数…

vue3【详解】选项式 API 实现逻辑复用

抽离逻辑代码到一个函数函数命名约定为 useXxxx格式 ( React Hooks 也是 )在 setup 中引用 useXxx 函数 演示代码&#xff1a;实时获取鼠标的坐标 逻辑封装 useMousePosition.js // 导入 ref, onMounted, onUnmounted import { ref, onMounted, onUnmounted } from "vue…