【数据结构初阶 7】二叉树:链式二叉树的基本操作实现

文章目录

  • 🌈 Ⅰ 定义二叉树结点
  • 🌈 Ⅱ 创建二叉树结点
  • 🌈 Ⅲ 遍历二叉树
    • 1. 先序遍历
    • 2. 中序遍历
    • 3. 后序遍历
    • 4. 层序遍历
  • 🌈 Ⅳ 销毁二叉树

🌈 Ⅰ 定义二叉树结点

1. 每个结点都由三部分组成

  1. 数据域:存储本结点的数据。
  2. 左孩子域:存储该结点左孩子的地址,即指向该结点左子树的根结点。
  3. 右孩子域:存储该结点右孩子的地址,即指向该结点右子树的根结点。

在这里插入图片描述

2. 定义二叉树结点

typedef int BTDataType;typedef struct TreeNode			// 树结点
{BTDataType data;			// 数据域struct TreeNode* lchild;	// 左孩子域struct TreeNode* rchild;	// 右孩子域
}TreeNode;

🌈 Ⅱ 创建二叉树结点

  • malloc 一个新结点,然后将数据放进该结点数据域,新结点左右孩子都为空。
TreeNode* BuyTreeNode(int x)
{TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));assert(node);node->data = x;						node->lchild = node->rchild = NULL;	// 新结点的左右孩子域都为空return node;
}

🌈 Ⅲ 遍历二叉树

递归遍历的结束条件

  • 当递归到某个结点为 NULL 时返回,计算机不知道哪个结点为叶子结点,只有当递归到某个结点的左右孩子域都为 NULL 时才能确定该结点为叶结点。

在这里插入图片描述

1. 先序遍历

  1. 对于一棵二叉树,其中任意一棵子树都按照根结点、左子树、右子树的顺序访问。
  2. 访问完当前结点后就去访问其左子树,左子树访问完后就去访问该结点右子树。
  3. 对于该结点左右子树的访问方式和第二步一致。

在这里插入图片描述

// 先序遍历
void TreePrevOrder(TreeNode* root)
{if (NULL == root)					// 结点为空时返回{return;}printf("%d ", root->data);		// 先访问当前结点TreePrevOrder(root->lchild);	// 当前结点访问完了就去访问左子树TreePrevOrder(root->rchild);	// 左子树也访问完了最后去访问右子树
}

2. 中序遍历

  • 按照 左子树 → 当前结点 → 右子树 的顺序访问树中的每棵子树。
  • 对于树中的任意结点,在访问完该结点的左子树之前都不能访问该结点。

在这里插入图片描述

// 中序遍历
void TreeInOrder(TreeNode* root)
{if (NULL == root){return;}TreePrevOrder(root->lchild);	// 优先访问当前结点的左子树printf("%d ", root->data);		// 访问完当前结点的左子树后才能访问该结点TreePrevOrder(root->rchild);	// 最后才能去访问右子树
}

3. 后序遍历

  • 按照 左子树 → 右子树 → 当前结点 的顺序访问树中的每棵子树。
  • 对于树中的任意结点,在访问完该结点的左子树和右子树之前都不能访问该结点。

在这里插入图片描述

// 后续遍历
void TreePostOrder(TreeNode* root)
{if (NULL == root){return;}TreePrevOrder(root->lchild);	// 优先访问当前结点的左子树TreePrevOrder(root->rchild);	// 然后访问当前结点的右子树printf("%d ", root->data);		// 最后才能访问当前结点
}

4. 层序遍历

实现思路

  • 借助队列进行层次遍历。
  • 将当前结点放入队列,然后出队列。
  • 出队列时,该结点还要顺带将其非空的左右孩子结点也入队列。
  • 等到队列为空时,这样出队列的结点顺序就是二叉树的层序遍历结果。

举个例子

在这里插入图片描述

实现代码

void TreeLevelOrder(TreeNode* root)
{Queue q;								// 创建队列QueueInit(&q);							// 队列初始化if (root != NULL)						// 将非空结点入队列{QueuePush(&q, root);}int LevelSize = 1;						// 用来记录每层结点的个数while (!QueueEmpty(&q))					// 队列非空时二叉树没有遍历完{while (LevelSize--)					// 控制一层一层输出结点{TreeNode* front = QueueFront(&q);QueuePop(&q);					// 队头结点出队列printf("%d ", front->data);		// 打印队头结点的值if (front->left != NULL)		// 出队时将其非空左孩子结点入队{QueuePush(&q, front->left);}if (front->right != NULL)		// 出队时将其非空右孩子结点入队{QueuePush(&q, front->right);}}printf("\n");						// 输出完一层的结点就换行LevelSize = QueueSize(&q);			// 队列内元素个数就是下一层结点数}QueueDestroy(&q);						// 销毁队列
}

🌈 Ⅳ 销毁二叉树

  • 采用后序的方式删除二叉树,先删完左右子树再删根结点。
  • 对于树中的每棵子树都采用上述方法。
void TreeDestory(TreeNode* root)
{if (NULL == root){return;}TreeDestory(root->lchild);	// 先删左子树TreeDestory(root->rchild);	// 再删右子树free(root);					// 最后删根结点
}

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

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

相关文章

zabix如何使用

参考: https://answer.baidu.com/answer/land?paramseICmjlQbKYoxsL%2FqfgCzHwwdZgopJAvMZAHKa3drgU%2FSJ1bNM3b6tsTVDzyQ5f7ppyQoGaA%2F4yGtMDl5bKmjm8U1Rg1%2Bbkx9lFcMiTCoR61wPpxmrT8ikf1MEprLriHNHsFmc6fVQz8fJsN3ybjjy1sVz9sGkS9gq2W8IYqRBWZHnGdsgB%2BpDo9hO…

代码随想录Leetcode474. 一和零

题目&#xff1a; 代码(首刷看解析 2024年2月26日&#xff09; class Solution { public:// 二维 0 1背包int findMaxForm(vector<string>& strs, int m, int n) {// 1 二维 [i]表示 0 的个数&#xff0c;上限m; [j]表示 1 的个数&#xff0c;上限nvector<vector…

大佬推荐的网络安全学习路线(从基础到高级)

说起网络安全&#xff0c;你可能会担心它是一个过时的行业。有人说&#xff0c;网络安全快卷死了&#xff0c;你既要攻又要防&#xff0c;并且随着技术的发展&#xff0c;你还要不断地学习&#xff0c;不在卷中生&#xff0c;就在卷中死。 实际上&#xff0c;随着数字化进程的…

Node.js_基础知识(计算机硬件基础)

主机的基本组成 CPU:Central Processing Unit,即中央处理器,是计算机的核心部件。是一块集成电路芯片,能够执行计算机指令并控制计算机的各种操作,负责运算和处理数据内存:是电脑硬件中的一块电路板,用于暂时存储CPU中的运算数据,是计算机与CPU进行沟通的桥梁,负责存储…

油烟净化器绿色环保引领清新餐饮时代

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 在城市的喧嚣中&#xff0c;餐饮业作为人们生活不可或缺的一部分&#xff0c;如何在美食的同时保障健康、提升生活质量成为摆…

BUGKU-WEB 文件包含

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 你说啥我就干啥&#xff1a;点击一下试试你会想到PHP伪协议这方面去嘛&#xff0c;你有这方面的知识储备吗&#xff1f; 相关工具 解题步骤 查看源码 看到了一点提示信息&#xff1a; ./index.…

中国水果采摘机器人行业市场研究及发展趋势分析报告

全版价格&#xff1a;壹捌零零 报告版本&#xff1a;下单后会更新至最新版本 交货时间&#xff1a;1-2天 第一章 2016-2026年中国水果采摘机器人行业总概 1.1 中国水果采摘机器人行业发展概述 机器人技术的发展是一个国家高科技水平和工业自动化程度的重要标志和体现。机器…

Python文件和异常(二)

目录 三、异常 &#xff08;一&#xff09;处理 ZeroDivisionError 异常 &#xff08;二&#xff09;使用 try-except 代码块 &#xff08;三&#xff09;使用异常避免崩溃 &#xff08;四&#xff09;else 代码块 &#xff08;五&#xff09;处理 FileNotFoundError 异常…

什么是web组态?

一、web组态的定义和背景 在深入探讨之前&#xff0c;我们先回顾一下“组态”的定义。在工业自动化领域&#xff0c;组态软件是用于创建监控和数据采集&#xff08;SCADA&#xff09;系统的工具&#xff0c;它允许工程师构建图形界面&#xff0c;实现与各种设备和机器的数据交互…

C++线程同步(下)

多线程同步 概述信号量示例一代码实现运行结果分析示例二开发环境代码实现运行结果分析future和promise示例一实现代码运行结果分析示例二实现代码运行结果示例三实现代码运行结果示例四示例代码运行结果注意附加示例扩展实现代码运行结果注意扩展原子应用场景头文件示例实现代…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义&#xff1a; 设G&#xff08;V&#xff0c;E&#xff09;是一个具有n个顶点的有向图&#xff0c;V中的顶点序列称为一个拓扑序列&#xff0c;当且仅当满足下列条件&#xff1a;若从顶点到有一条路径&#xff0c;则在顶点序列中顶点必在之前。 2.基本思想…

prime_series_level-1靶场详解

环境搭建 官网https://www.vulnhub.com/entry/prime-1,358/ 直接导入靶机 解题思路 arp-scan -l 确认靶机ip为192.168.236.136 也可以使用nmap扫网段 nmap -sn 192.168.236.0/24 使用nmap扫描靶机开放的端口 nmap -sS -T5 --min-rate 10000 192.168.236.136 -sC -p- &#xf…

【项目部署上线】宝塔部署前端Docker部署后端

【项目部署上线】宝塔部署前端&Docker部署后端 文章目录 【项目部署上线】宝塔部署前端&Docker部署后端1.安装依赖1.1 安装mysql1.2 安装Canal1.3 安装redis1.4 安装rabbitmq1.5 安装nacos 2. 部署前端3. 部署后端 1.安装依赖 1.1 安装mysql docker run -d -p 3306:3…

Redis主从、哨兵、Redis Cluster集群架构

Redis主从、哨兵、Redis Cluster集群架构 Redis主从架构 Redis主从架构搭建 主从搭建的问题 如果同步数据失败&#xff0c;查看log日志报错无法连接&#xff0c;检查是否端口未开放出现”Error reply to PING from master:...“日志&#xff0c;修改参数protected-mode no …

S32 Design Studio PE工具配置TMR

配置步骤 配置内容 生成的配置结构体如下&#xff0c;在Generated_Code路径下的lpTmr.c文件和lpTmr.h文件。 /*! lpTmr1 configuration structure */ const lptmr_config_t lpTmr1_config0 {.workMode LPTMR_WORKMODE_PULSECOUNTER,.dmaRequest false,.interruptEnable tr…

C++力扣题目 1143--最长公共子序列 1035--不相交的线 53--最大子数组和

1143.最长公共子序列 力扣题目链接(opens new window) 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff0…

力扣用例题:2的幂

此题的解题方法在于根据用例调整代码 bool isPowerOfTwo(int n) {if(n1){return true;}if(n<0){return false;}while(n>2){if(n%21){return false;}nn/2; }if(n1){return false;}return true;}

Spring的另一大的特征:AOP

目录 AOP &#xff08;Aspect Oriented Programming&#xff09;AOP 入门案例&#xff08;注解版&#xff09;AOP 工作流程——代理AOP切入点表达式AOP 通知类型AOP通知获取数据获取切入点方法的参数获取切入点方法返回值获取切入点方法运行异常信息 百度网盘分享链接输入密码数…

解决node-sass下载报错

vue项目执行npm install报错 npm ERR node-sass postinstall node scripts/build.js npm ERR Exit status 1 先执行下面命令如果没报错就解决了 npm install --save-dev node-sass --registryhttps://registry.npmmirror.com要是执行上面报错&#xff1a;gyp ERR! stack Error…

大语言模型LLM分布式训练:PyTorch下的分布式训练(LLM系列06)

文章目录 大语言模型LLM分布式训练&#xff1a;PyTorch下的分布式训练&#xff08;LLM系列06&#xff09;一、引言二、PyTorch分布式训练基础三、PyTorch中实现数据并行训练四、优化分布式训练性能 大语言模型LLM分布式训练&#xff1a;PyTorch下的分布式训练&#xff08;LLM系…