数据结构---C语言版 树 图解版力扣144/94/102

news2024/11/20 14:15:07

树的声明:

#include<stdio.h>
#include<stdlib.h> 
using namespace std;

typedef char BiElemType;
typedef struct BiTNode{
	BiElemType data;
	struct BiTNode* lchild;
	struct BiTNode* rchild;
}BiTNode,*BiTree; 

//树中任何一个节点都是一个结构体,它的空间我们是通过malloc申请出来的。
//tag 辅助队列使用
typedef struct tag{
	BiTree p;
	struct tag* pnext;
}tag_t,*ptag_t; 

二叉树的层次建立

画图理解:

//层次建树 
int main(){
	BiTree  pnew;//存放树的新结点 
	char c;
	BiTree tree=NULL;//建立一棵树,让其为空 
	ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;
	//phead,ptail是辅助队列的头,尾指针,listpnew指向存放新的队列节点,pcur指向当前元素的双亲节点;
	while(scanf("%c",&c)){
		if(c=="\n") break;
		
		//calloc(n,m);n 申请空间个数,m申请一个空间的大小;总大小为n*m;
		//跟malloc相比,他可以直接将元素赋值为空 
		pnew=(BiTNode*)calloc(1,sizeof(BiTNode));//申请一个新的树节点 ,并保证左右孩子均为空 
		pnew->data=c;
		
		listpnew=(tag_t*)calloc(1,sizeof(tag_t));//申请一个新的辅助队列节点
		listpnew->p=pnew;//新的辅助队列节点 对应的树元素是 pnew 
		
		if(!tree){//树为空,即 pnew为根节点 
			tree= pnew;//令pnew为根节点 
			phead=listpnew;ptail=listpnew;//队列头尾都指向此时这个节点的队列节点 
			pcur=listpnew;
			continue;
		}
		else {//树不为空, 此队列节点依然需要入队 
			ptail->pnext=listpnew;
			ptail=listpnew; 
			//如果放在左孩子位置,只需要入树即可 
			if(!pcur->p->lchild)
				pcur->p->lchild= pnew;
			//如果放在右孩子位置,需要入树且(放入后此节点的两个孩子就全了)双亲节点需要更换为下一个 
			else if(!pcur->p->rchild){
				pcur->p->lchild= pnew;
				pcur=pcur->pnext;
			}
		}
	}
	return 0;
}

二叉树的前中后序遍历--递归

前序遍历:根左右,中序遍历:左根右 后序遍历:左右根(所谓前中后是根的相对位置,这个也是功能函数所在的位置)

//功能
void visit(BiTree p){
	printf("%c",p->data);
}
//前序 
void Preorder(BiTree p){
	if(p){
		visit(p);
		Preorder(p->lchild);
		Preorder(p->rchild);	
	}
}
//中序 
void INorder(BiTree p){
	if(p){
		INorder(p->lchild);
		visit(p);
		INorder(p->rchild);	
	}
}
//后序 
void Postorder(BiTree p){
	if(p){
		Postorder(p->lchild);
		Postorder(p->rchild);
		visit(p);	
	}
}

层次遍历---需要借助队列

层次遍历:一层一层的往下走。又称广度优先遍历

//层次遍历 
void Leverorder(BiTree T){
	LinkQueue Q;
	InitQueue(Q);
    EnQueue(Q,T);
	BiTree p;
	while(!IsEmpty(Q)){
		DeQueue(Q,p);//删除存放到p中
		putchar(p->data);
		if(p->lchild)
			EnQueue(Q,p);
		if(p->rchild)
			EnQueue(Q,p);
	}
}

练习题

144. 二叉树的前序遍历

94. 二叉树的中序遍历

102. 二叉树的层序遍历

另外推荐一篇题解:BFS 的使用场景总结:层序遍历、最短路径问题:

本篇over

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

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

相关文章

优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;前端零基础教学&#xff0c;实战进阶 景天的主页&#xff1a;景天科技苑 文章目录 Vuevue.js库的基本使用vue.js的M-V-VM思…

CountDownLatch介绍和使用

1. CountDownLatch是什么 CountDownLatch 是 Java.util.concurrent 包中的一个同步工具类&#xff0c;用于控制线程的执行顺序。它的主要作用是让一个或多个线程等待其他线程完成操作后再继续执行。 2. CountDownLatch 类常用方法 CountDownLatch(int count) 是 CountDownLa…

网工内推 | 国企、上市公司网工、运维,CCNA即可,补贴福利多

01 深圳新思 招聘岗位&#xff1a;网络工程师&#xff08;中电集团&#xff09; 职责描述&#xff1a; 1&#xff1a;负责办公室电脑的桌面运维&#xff0c;主要是windows维护与应用维护&#xff1b; 2&#xff1a;负责办公室网络设备配置&#xff0c;如防火墙&#xff0c;交换…

应用工程中获取Shapefile文件的图形信息并显示

本文用纯前端获取shp文件以及前后端交互的方式获取Shapefile文件中的图形信息 1.案例说明 在日常的WebGIS开发中&#xff0c;我们往往会面对&#xff0c;需要用户选择矢量数据&#xff0c;通过矢量数据中的空间范围信息&#xff0c;显示在界面上&#xff0c;并给用户的下一步…

目标检测C-RNN,Fast C-RNN,Faster C-RNN,SSD,Mask R-CNN 理论简单介绍

参考&#xff1a; https://zh-v2.d2l.ai/chapter_computer-vision/multiscale-object-detection.html R-CNN 及系列 区域卷积神经网络 region-based CNN R-CNN R-CNN首先从输入图像中选取若干&#xff08;例如2000个&#xff09;提议区域&#xff0c;并标注它们的类别和边界…

两个笔记本如何将一个笔记本作为另一个笔记本的拓展屏

需求是有两个笔记本&#xff0c;一个笔记本闲置&#xff0c;另一个笔记本是主力本。想将另一个闲置的笔记本连接到主力本上作为拓展屏使用。网上搜了好久&#xff0c;有一些人提到了&#xff0c;也有一些视频但是文章比较少。简单总结一下吧 上述需求有两种方式 第一种&#x…

学习vue3第五节(reactive 及其相关)

1、定义 reactive() 创建一个响应式代理对象&#xff0c;不同于ref()可以创建任意类型的数据&#xff0c;而reactive()只能是对象&#xff0c;会响应式的深层次解包任何属性&#xff0c;将其标注为响应式 响应式是基于ES6的proxy实现的代理对象&#xff0c;该proxy对象与原对象…

【C++】C++的初步认识

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;自律以修身&#xff0c;自省以观己。自学以长识&#xff0c;自处以蓄力。 &#x1f33b;Hi~大家好&#xff0c;这次文章是C的初步认识&#xff0c;包括从C语言到…

【LeetCode: 2864. 最大二进制奇数 + 模拟 + 位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

基于SSH的物流配送管理系统的设计与实现

摘 要 当今社会&#xff0c;物流配送已成为影响经济发展的显著因素。而随着社会信息化发展&#xff0c;建立有效的物流配送管理体系不仅能够减少物流成本&#xff0c;更能够提升工作人员的工作效率与客户的满意度。而基于B/S架构的物流配送管理体系&#xff0c;不仅具有良好的…

Navicat操作MYSQL

Navicat操作MYSQL 数据表的操作-创建表数据表的操作-修改、删除表数据的操作数据类型与约束常用数据类型数据约束 数据库备份与还原数据库的备份数据表的还原 数据表的操作-创建表 数据表的操作-修改、删除表 数据的操作 数据类型与约束 常用数据类型 整型&#xff1a;int 有符…

这是一份简单到没朋友的上手图数据库的图文教程

前几天和社区小伙伴友好交流&#xff08;闲聊&#xff09;&#xff0c;不少加入 NebulaGraph 的小伙伴虽然对图感兴趣&#xff0c;但是因为业务调整或者是时间缘故&#xff0c;最终没能用上 NebulaGraph。而他们当中不少的小伙伴说&#xff0c;春节我打算好好学习一番。既然大家…

打造你的HTML5打地鼠游戏:零基础入门教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

mysql基于mycat实现读写分离

试验环境 基于mysql主从复制已经实现 mycat主机192.168.199.149&#xff0c;安装好java和jdk 数据库主机192.168.199.150 数据库从机192.168.199.151 149配置 下载mycat并解压 vim /root/mycat/conf/server.xml vim /root/mycat/conf/schema.xml 150是主数据库&#xff0…

[Linux][CentOs][Mysql]基于Linux-CentOs7.9系统安装并配置开机自启Mysql-8.0.28数据库

目录 一、准备工作&#xff1a;获取安装包和相应工具 &#xff08;一&#xff09;所需安装包 &#xff08;二&#xff09;安装包下载链接 &#xff08;三&#xff09;在服务器上创建文件夹并上传安装包 二、安装MySql &#xff08;一&#xff09;删除系统自带的mariadb …

OceanBase原理之内存管理

第1章 前言 1.1 多租户管理简介 OceanBase数据库中&#xff0c;应用了单集群多租户的设计&#xff0c;使得一个集群内能够创建多个彼此独立的租户。在OceanBase数据库&#xff0c;租户成为了资源分配的单位&#xff0c;同时还是数据库对象管理和资源管理的基础。 在某种程度…

代码随想录算法训练营Day44 ||leetCode 完全背包 || 518. 零钱兑换 II || 377. 组合总和 Ⅳ

完全背包 518. 零钱兑换 II 遍历硬币和金额&#xff0c;累加所有可能 class Solution { public:int change(int amount, vector<int>& coins) {vector<int> dp(amount1,0);dp[0]1;for (int i 0; i < coins.size();i){for(int j coins[i]; j < amount;…

安装PyTorch详细过程

安装anaconda 登录anaconda的官网下载&#xff0c;anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 跳转到这个页面如果你的Python版本正好是3.8版&#xff0c;那便可以直接根据系统去选择自己相应的下载版本就可以了。 但是如果你的Python版本号不是当前页面…

linux驱动——中断

1.Cortex-A系列的中断的简介 中断的基本概念&#xff1a;(interrupt) 中断本质上是系统内部的异常机制,当中断产生之后&#xff0c;他会停下当前正在执行的任务&#xff0c;转而去做其他的事情,在停下当前正在执行的任务之前,要先入栈&#xff08;保护现场,其他的事情做完之后…

漏洞原理 | CORS跨域学习篇

0x01&#xff1a;原理 1、 什么是CORS 全称跨域资源共享&#xff0c;用来绕过SOP(同源策略)来实现跨域访问的一种技术。 CORS漏洞利用CORS技术窃取用户敏感信息 2、 同源策略简介 同源策略是浏览器最核心也是最基本的安全功能&#xff0c;不同源的客户端脚本在没有明确授权…