树的层序遍历,平衡二叉树,以及反转二叉树

一、树的层序遍历

层序遍历的实现:

1.依赖于队列的数据结构

2.核心怎么实现:

        1)创建一个队列的容器对象。

        2)判断根节点是否为空,不为空则添加根节点到队列中。

        3)遍历是一个循环性的工作,写一个死循环,死循环的第一步就是跳出死循环的条件:当队列中没有东西时退出(换句话说,没东西可遍历了)。

        4)每弹出一个元素,再访问(就是进行符合场景的操作),最后添加两边的左右子节点(如果不为空的话)。

代码实现:

队列的代码:

#pragma once#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include<stdbool.h>typedef struct BinaryTreeNode* QDataType;typedef struct QueueNode
{struct QueueNode* _pNext;QDataType _val;
}QNode;typedef struct Queue
{QNode* _front;QNode* _rear;int size;
}Queue;void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);// 队尾插入
void QueuePush(Queue* pq, QDataType x);
// 队头删除
void QueuePop(Queue* pq);// 取队头和队尾的数据
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);队尾插入
//void QueuePush(QNode** pphead, QNode** pptail, QDataType x);队头删除
//void QueuePop(QNode** pphead, QNode** pptail);
#include"Queue.h"
// 初始化队列
void QueueInit(Queue* q)
{assert(q);q->_front = NULL;q->_rear = NULL;q->size = 0;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* tmp = (QNode*)malloc(sizeof(QNode));if (tmp == NULL){perror("malloc fail");return;}else{tmp->_data = data;tmp->_pNext = NULL;}if (q->_rear == NULL){q->_front = q->_rear = tmp;}else{q->_rear->_pNext = tmp;q->_rear = tmp;}q->size++;
}
// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(q->_front);assert(q->size != 0);if (q->_front->_pNext == NULL)//只有一个节点{free(q->_front);q->_front = q->_rear = NULL;}else{QNode* next = q->_front->_pNext;free(q->_front->_pNext);q->_front = next;}q->size--;
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{assert(q);assert(q->_front);return q->_front->_data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{assert(q);assert(q->_rear);return q->_rear->_data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);return q->size;
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{assert(q);return q->size == 0;
}
// 销毁队列
void QueueDestroy(Queue* q)
{QNode* tmp = q->_front;while (tmp != NULL){QNode* next = tmp->_pNext;free(tmp);tmp = next;}q->_front = q->_rear = NULL;q->size = 0;
}
void TreeLevelOrder(BTNode* root)//层序遍历
{Queue pq;QueueInit(&pq);if (root)QueuePush(&pq, root);while (!QueueEmpty(&pq)){BTNode* front = QueueFront(&pq);QueuePop(&pq);printf("%d ", front->_data);if (front->_left)QueuePush(&pq, front->_left);if (front->_right)QueuePush(&pq, front->_right);}QueueDestroy(&pq);
}

二、平衡二叉树的判断

这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 111,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,

int maxDepth(struct TreeNode* root){return root ? 1 + fmax(maxDepth(root->left) , maxDepth(root->right)) : 0;      
}bool isBalanced(struct TreeNode* root){if(root == NULL)return true;int left = maxDepth(root->left);int right = maxDepth(root->right);return abs(left - right) < 2&& isBalanced(root->left)&& isBalanced(root->right);
}

三、树的反转

这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root为根节点的整棵子树的翻转。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
struct TreeNode* invertTree(struct TreeNode* root) {if(root==NULL){return NULL;}struct TreeNode*tmp=root->left;root->left=root->right;root->right=tmp;invertTree(root->left);invertTree(root->right);return root;
}

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

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

相关文章

小红书无限加群脚本无需ROOT【使用简单无教程】

小红书无限加群脚本无需ROOT&#xff0c;包含了对应的小红书版本【使用简单无教程】 链接&#xff1a;https://pan.baidu.com/s/1HkLhahmHDFMKvqCC3Q3haA?pwd6hzf 提取码&#xff1a;6hzf

【Vue】computed 和 methods 的区别

概述 在使用时&#xff0c;computed 当做属性使用&#xff0c;而 methods 则当做方法调用computed 可以具有 getter 和 setter&#xff0c;因此可以赋值&#xff0c;而 methods 不行computed 无法接收多个参数&#xff0c;而 methods 可以computed 具有缓存&#xff0c;而 met…

Stable Diffusion教程:从入门到精通

Stable Diffusion是一种基于深度学习的图像生成技术&#xff0c;能够生成高质量的图像&#xff0c;广泛应用于艺术创作、广告设计和游戏开发等领域。本教程将详细介绍Stable Diffusion的基础知识、安装和配置方法&#xff0c;以及如何使用它进行图像生成。 1. 什么是Stable Di…

Python函数、类和方法

大家好&#xff0c;当涉及到编写可维护、可扩展且易于测试的代码时&#xff0c;Python提供了一些强大的工具和概念&#xff0c;其中包括函数、类和方法。这些是Python编程中的核心要素&#xff0c;可以帮助我们构建高效的测试框架和可靠的测试用例。 本文将探讨Python中的函数、…

大语言模型的工程技巧(三)——分布式计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练&#xff0c;是其获得成功的重要原…

BUUCTF靶场[Web] [极客大挑战 2019]Havefun1、[HCTF 2018]WarmUp1、[ACTF2020 新生赛]Include

[web][极客大挑战 2019]Havefun1 考点&#xff1a;前端、GET传参 点开网址&#xff0c;发现是这个界面 点击界面没有回显&#xff0c;老规矩查看源代码&#xff0c;看到以下代码 代码主要意思为&#xff1a; 用get传参&#xff0c;将所传的参数给cat&#xff0c;如果catdog…

揭秘Spring Bean的生命脉搏:深度剖析构造方法的推断艺术

1. 引言 在Spring框架中&#xff0c;Bean的生命周期是一个至关重要的概念。从Bean的创建、初始化到销毁&#xff0c;每一个阶段都承载着框架与用户代码的交互。而在Bean的创建阶段&#xff0c;构造方法的推断显得尤为重要。本文将从源码层面深入剖析Spring是如何推断并选择构造…

程序员做副业项目,别把事情复杂化

赚钱&#xff0c;别把简单的事情复杂化 不要把简单的事情复杂化。在大多数情况下&#xff0c;你并不需要一个应用程序、一个小程序、一个公众号、一个微商城、编写深度文章、建立一个社群&#xff0c;甚至不需要所谓的个人品牌、IP或运营技巧。 你只需要一个装满5000个&#…

Linux基础(五):常用基本命令

从本节开始&#xff0c;我们正式进入Linux的学习&#xff0c;通过前面的了解&#xff0c;我们知道我们要以命令的形式使用操作系统&#xff08;使用操作系统提供的各类命令&#xff0c;以获得字符反馈的形式去使用操作系统。&#xff09;&#xff0c;因此&#xff0c;我们是很有…

python将多个音频文件与一张图片合成视频

代码中m4a可以换成mp3,图片和音频放同一目录&#xff0c;图片名image.jpg&#xff0c;多线程max_workers可以根据CPU核心数量修改。 import os import subprocess import sys import concurrent.futures import ffmpeg def get_media_duration(media_path): probe ffmp…

Linkis踩坑记录

从WeDataSphere的docker镜像中把代码和配置拷贝到普通环境运行&#xff0c;结果linkis提交任务总是报错&#xff1a; Failed to execute task TaskID_1_otJobI d_astJob_0_codeExec_0 org.apache.linkis.orchestrator.ecm.exception.ECMPluginErrorException: errCode: 12003 …

【全开源】点餐小程序系统源码(ThinkPHP+FastAdmin+UniApp)

基于ThinkPHPFastAdminUniApp开发的点餐微信小程序&#xff0c;类似肯德基&#xff0c;麦当劳&#xff0c;喜茶等小程序多店铺模式&#xff0c;支持子商户模式&#xff0c;提供全部前后台无加密源代码和数据库&#xff0c;支持私有化部署。 革新餐饮行业的智慧点餐解决方案 一…

【vue-6】监听

一、监听watch 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、16QAM调制原理 在16QAM&#xff08;16 Quadrature Amplitude Modulation&#xff09;调制中&#xff0c;一个符号表示4个比特的数据。这种调制方式结合了幅度调制和相位调制&#xff0c;能够在相同的频谱资源下传输更多…

【Java基础】IO流(5) —— 序列流、内存流

【Java基础】IO流(1) —— 简介 【Java基础】IO流(2) —— 字符流 【Java基础】IO流(3) —— 字节流 【Java基础】IO流(4) —— 转换流、打印流 【Java基础】IO流(5) —— 序列流、内存流 【Java基础】IO流(6) —— 随机访问文件流、数据流 序列流 SequenceInputStream 序列…

EEGLAB的相关使用

目录 概念 1.安装EEGLAB 2.文件实例演示 导入数据集处理 &#xff08;1&#xff09;导入数据集 &#xff08;2&#xff09;画图 &#xff08;3&#xff09; 修改并存储数据集 &#xff08;4&#xff09; 保存数据集 &#xff08;5&#xff09; 删除数据集 &#xff0…

技术前沿 |【BLIP:统一理解和生成的自举多模态模型研究】

BLIP&#xff1a;统一理解和生成的自举多模态模型研究 摘要引言一、BLIP模型概述二、 BLIP模型在多模态任务中的应用三、总结 摘要 本文介绍了BLIP&#xff08;Bootstrapping Language-Image Pre-training&#xff09;模型&#xff0c;一个前沿的多模态模型&#xff0c;通过自…

散列(哈希)及其练习题(基础)

目录 散列 字符出现次数 力扣经典题&#xff1a;两数之和 集合运算 交 并 差 字符串的出现次数 散列 导入&#xff1a; 有N个数和M个数&#xff0c;如何判断M个数中每个数是否在N中出现&#xff1f; 思想&#xff1a;空间换时间 创建hashtable&#xff0c;以N个数本…

图_基础算法

图这种数据结构还有一些比较特殊的算法&#xff0c;比如二分图判断&#xff0c;有环图无环图的判断&#xff0c;拓扑排序&#xff0c;以及最经典的最小生成树&#xff0c;单源最短路径问题&#xff0c;更难的就是类似网络流这样的问题。 先看拓扑排序&#xff08;有环无环&…

【linux性能分析】heaptrack分析内存占用

文章目录 1. Heaptrack是什么2. Heaptrack有哪些功能3. Heaptrack和valgrind massif对比4. Heaptrack安装5. Heaptrack生成追踪文件6. heaptrack_gui进行内存分析7. heaptrack_print也能用于堆分析8. 报错解决9. 补充介绍&#xff1a;heaptrack编译安装 1. Heaptrack是什么 he…