数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)

二叉树的遍历与练习

  • 一.二叉树的基本遍历形式
    • 1.前序遍历(深度优先遍历)
    • 2.中序遍历(深度优先遍历)
    • 3.后序遍历(深度优先遍历)
    • 4.层序遍历!!(广度优先遍历)
  • 二.二叉树的leetcode小练习
    • 1.判断平衡二叉树
      • 1)正常解法
      • 2)优化解法
    • 2.对称二叉树

通过上一篇文章,我们初识了我们的二叉树
二叉树初识
那么接下来我们就要深入去理解二叉树的部分知识了,显然这只是在二叉树家族中迈出的一小步qwq,入门。

一.二叉树的基本遍历形式

我们先建立一棵伪树,方便我们后续的使用:请添加图片描述

int main()
{BinaryTree p1;BinaryTree p2;BinaryTree p3;BinaryTree p4;BinaryTree p5;BinaryTree p6;p1.left = &p2;p1.right = &p3;p2.left = NULL;p2.right = &p4;p3.left = &p5;p3.right = NULL;p4.left = NULL;p4.right = &p6;p6.left = NULL;p6.right = NULL;p5.left = NULL;p5.right = NULL;p1.val = 'A';p2.val = 'B';p3.val = 'C';p4.val = 'D';p5.val = 'E';p6.val = 'F';
}

1.前序遍历(深度优先遍历)

前序遍历的本质,就是根节点->左孩子->右孩子。并且通过递归调用的方式去实现。
请添加图片描述

void treefront(BinaryTree* p)//前序遍历
{if (p == NULL){printf("NULL ");return;}printf("%c ", p->val);treefront(p->left);treefront(p->right);}

2.中序遍历(深度优先遍历)

同理,中序遍历的本质就是左孩子->根节点->右孩子
如:
请添加图片描述

void treemid(BinaryTree* p)//中序遍历
{if (p == NULL){printf("NULL ");return;}treemid(p->left);printf("%c ", p->val);treemid(p->right);}

3.后序遍历(深度优先遍历)

同理,后序遍历的本质就是:左孩子->右孩子->根节点
如:
请添加图片描述

void treebehind(BinaryTree* p)//后序遍历
{if (p == NULL){printf("NULL ");return;}treebehind(p->left);treebehind(p->right);printf("%c ", p->val);
}

4.层序遍历!!(广度优先遍历)

层序遍历与以上三种遍历方式完全不同,他没有使用递归的思想,而是去使用了迭代的方法:
请添加图片描述
这里我们将使用我们先前学到的循环队列的数据结构去完成二叉树的层序遍历
逻辑如下:
运用队列的先进先出的特点
1.我们先塞入第一个根节点,
2.我们取出队列排头的节点的时候,自动往队列里面添加两个他的儿子节点
3.当队列里面为空的时候,我们就完成了一次层序遍历
请添加图片描述
接下来我们进行代码实现:
1.伪树

int main()
{BinaryTree p1;BinaryTree p2;BinaryTree p3;BinaryTree p4;BinaryTree p5;BinaryTree p6;p1.left = &p2;p1.right = &p3;p2.left = NULL;p2.right = &p4;p3.left = &p5;p3.right = NULL;p4.left = NULL;p4.right = &p6;p6.left = NULL;p6.right = NULL;p5.left = NULL;p5.right = NULL;p1.val = 'A';p2.val = 'B';p3.val = 'C';p4.val = 'D';p5.val = 'E';p6.val = 'F';
}

2.层序遍历

#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef BinaryTree* QueueDataType;
typedef struct CirQueue
{QueueDataType* q;int front;int rear;int capacity;
}CirQueue;QueueDataType Cirqueuefront(CirQueue* p1)
{return *((p1->q)+(p1->front));
}CirQueue* CirQueueCreate(CirQueue* p,size_t x)
{p = (CirQueue*)malloc(sizeof(CirQueue));p->q = (QueueDataType*)(malloc(sizeof(QueueDataType) * x));p->capacity = x;p->front = 0;p->rear = 0;
}
int isCirQueueEmpty(CirQueue* p)
{if (p->front == p->rear){return 1;}else{return 0;}
}
int isCirQueueFull(CirQueue* p)
{if ((p->rear+1) % p->capacity == p->front){return 1;}else{return 0;}
}
void CirQueuePop(CirQueue* p)
{if (!isCirQueueEmpty(p)){p->front=(p->front+1)%p->capacity;}else{return;}
}
void CirQueuePush(CirQueue* p,QueueDataType x)
{if (isCirQueueFull(p)){return;}else{*(p->q + p->rear) = x;p->rear = (p->rear + 1) % p->capacity;}
}void treeseq(BinaryTree* p)//层序遍历
{CirQueue* que=NULL;que = CirQueueCreate(que, 20);CirQueuePush(que, p);while (!isCirQueueEmpty(que)){if (Cirqueuefront(que) != NULL){printf("%c ", Cirqueuefront(que)->val);CirQueuePush(que, Cirqueuefront(que)->left);CirQueuePush(que, Cirqueuefront(que)->right);}else{printf("NULL ");}CirQueuePop(que);}
}

在这里插入图片描述

二.二叉树的leetcode小练习

1.判断平衡二叉树

在这里插入图片描述
平衡二叉树:当二叉树的每一个节点的两个子树的深度的差的绝对值小于1,则称为平衡二叉树。

1)正常解法

1.先创造求深度函数

int depthtree(struct TreeNode* root)
{if(root==NULL){return 0;}int leftdepth=depthtree(root->left);int rightdepth=depthtree(root->right);return 1+(leftdepth>rightdepth?leftdepth:rightdepth);
}

再通过分解子问题
求大树是否为平衡二叉树,我们先求解两个子树是不是平衡二叉树

bool isBalanced(struct TreeNode* root) {if(root==NULL){return true;}int left=depthtree(root->left);int right=depthtree(root->right);bool x=(left-right<=1)&&(left-right>=-1);if(!x){return false;}return isBalanced(root->left)&&isBalanced(root->right);
}

2)优化解法

刚刚的那种解法是一种低效的解法,通过前序遍历我们进行了很多次重复的计算。
所以我们考虑一下,是否可以使用后序遍历,
先快速来到底部,从底部向上走,而每一次的树的深度就可以直接将当前子树的高度++即可

bool _isBalanced(struct TreeNode* root,int* pdepth)
{if(root==NULL){return true;}int depth_left=0;int depth_right=0;if(!_isBalanced(root->left,&depth_left)){return false;}if(!_isBalanced(root->right,&depth_right)){return false;}if(abs(depth_right-depth_left)>1){return false;}*pdepth=1+(depth_right>depth_left?depth_right:depth_left);return true;
}
bool isBalanced(struct TreeNode* root) {int depth=0;return _isBalanced(root,&depth);
}

在这里插入图片描述

这样子我们只需要遍历n次,时间复杂度O(n)即可解决问题

2.对称二叉树

在这里插入图片描述
通过相反的遍历比较,可以得出是否为二叉树

bool issame(struct TreeNode* p1,struct TreeNode* p2)
{if(p1==NULL&&p2==NULL){return true;}else if((p1==NULL&&p2!=NULL)||(p1!=NULL&&p2==NULL)){return false;}return (p1->val==p2->val)&&issame(p1->left,p2->right)&&issame(p2->left,p1->right);
}
bool isSymmetric(struct TreeNode* root) {if(root==NULL){return true;}return issame(root->left,root->right);}

在这里插入图片描述

ps:创作不易,恳请留一个赞吧

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

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

相关文章

ChatGPT 与其他 AI 技术在短视频营销中的技术应用与协同策略

摘要&#xff1a; 本文深入探讨了 ChatGPT 及其他 AI 技术在短视频营销中的应用。从技术层面剖析了这些技术如何助力短视频内容创作、个性化推荐、用户互动以及营销效果评估等多方面&#xff0c;通过具体方法分析、数据引用与大模型工具介绍&#xff0c;旨在为短视频营销领域提…

先安装Ubuntu20.04,再安装win10实现双系统

准备 一个刻录好Ubuntu20.04系统u盘一个刻录了Ventory的U盘&#xff0c;其中有Windows10的iso系统文件。Ventory参考Gparted分区软件&#xff0c;用于腾出一块硬盘空间安装Win10 过程 给win10腾出一块硬盘空间&#xff0c;设置为NTFS格式 Ubuntu系统中其实已经有GParted软件…

数据结构------树(Java语言描述)

一、树的基本概念 树是一种非线性的数据结构&#xff0c;它由节点组成&#xff0c;有一个特定的节点称为根节点&#xff0c;其余节点可以分为多个互不相交的子树。 树中的节点具有以下特点&#xff1a; 1.每个节点有零个或多个子节点。 2.除了根节点外&#xff0c;每个节点…

查看浏览器的请求头

爬虫时用到了请求头&#xff0c;虽然可以用网上公开的&#xff0c;但是还是想了解一下本机浏览器的。以 Edge 为例&#xff0c;其余浏览器通用。 打开浏览器任一网页&#xff0c;按F12打开DevTools&#xff1b;或鼠标右键&#xff0c;选择“检查”。首次打开界面应该显示在网页…

如何在Python中进行数学建模?

数学建模是数据科学中使用的强大工具&#xff0c;通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统&#xff0c;为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程&#xff0c;重点关注数据科学中的应用。 数学建…

前后端分离,解决vue+axios跨域和proxyTable不生效等问题

看到我这篇文章前可能你以前看过很多类似的文章。至少我是这样的&#xff0c;因为一直没有很好的解决问题。 正文 当我们通过webstorm等IDE开发工具启动项目的时候&#xff0c;通过命令控制台可以观察到启动项目的命令 如下&#xff1a; webpack-dev-server --inline --prog…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES&#xff08;ECMAScript&#xff09; vs JS常量进一步探讨 obj对象的扩展面试&#xff1a;使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值&#xff1a;数组解构赋值&#xff1a;对象解构赋值&#xff1a;…

阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案

TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作&#xff0c;基于 diffusion 方法来直接的从音频到视频合成数字人&#xff0c;避免了中间的三维模型或面部 landmark 的需求&#xff0c;效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…

candence: 如何快速设置SUBCLASS 的颜色

如何快速设置SUBCLASS 的颜色 一、一般操作 正常情况下修改SUBCLASS&#xff0c;需要如下步骤进行设置&#xff1a; 二、快速操作 右键&#xff0c;选择一个颜色即可

多目标优化算法:多目标海星优化算法(MOSFOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、海星优化算法 海星优化算法&#xff08;Starfish Optimization Algorithm &#xff0c;SFOA&#xff09;是2024年提出的一种元启发式算法&#xff0c;该算法模拟了海星的行为&#xff0c;包括探索、捕食和再生。 算法灵感&#xff1a; SFOA的灵感来源于海星的捕食行为&…

实时质检-静音检测分析流程(运维人员使用)

前言 用户在实时质检时&#xff0c;开启了主叫或被叫静音检测功能&#xff0c;但是听录音时&#xff0c;主叫或被叫明明没有任何声音&#xff0c;但是通话没有被挂断。 说明主叫或被叫的静音阈值太低&#xff0c;导致系统没有把很小的声音认定为静音&#xff1b;或者检测非静音…

了解Redis(第一篇)

目录 Redis基础 什么事Redis Redis为什么这么快 除了 Redis&#xff0c;你还知道其他分布式缓存方案吗? 说-下 Redis 和 Memcached 的区别和共同点 为什么要用Redis? 什么是 Redis Module?有什么用? Redis基础 什么事Redis Redis &#xff08;REmote DIctionary S…

D77【 python 接口自动化学习】- python基础之HTTP

day77 postman接口请求 学习日期&#xff1a;20241123 学习目标&#xff1a;http 定义及实战&#xfe63;&#xfe63;postman接口请求 学习笔记&#xff1a; get请求 post请求 总结 get请求用于查询数据post请求用于添加数据

Element-Ui组件(icon组件)

一、前言 本篇文章主要是对官网的Icon组件进行总结归纳Icon 图标 | Element Plus 在现代Web应用开发中&#xff0c;图标是用户界面设计中不可或缺的一部分。它们不仅提升了用户体验&#xff0c;还使得信息的传达更加直观和高效。本文主要对Element Plus 官方提供的Icon组件进行…

SpringMVC——简介及入门

SpringMVC简介 看到SpringMVC这个名字&#xff0c;我们会发现其中包含Spring&#xff0c;那么SpringMVC和Spring之间有怎样的关系呢&#xff1f; SpringMVC隶属于Spring&#xff0c;是Spring技术中的一部分。 那么SpringMVC是用来做什么的呢&#xff1f; 回想web阶段&#x…

应急响应靶机——linux2

载入虚拟机&#xff0c;打开虚拟机&#xff1a; 居然是没有图形化界面的那种linux&#xff0c;账户密码&#xff1a;root/Inch957821.&#xff08;注意是大写的i还有英文字符的.&#xff09; 查看虚拟机IP&#xff0c;192.168.230.10是NAT模式下自动分配的 看起来不是特别舒服&…

《Python 股票交易分析:开启智能投资新时代》(二)

Python 进行股票交易分析的优势 简洁易读&#xff1a;Python 的语法简洁明了&#xff0c;即使是编程新手也能较快上手&#xff0c;降低了股票交易分析的门槛。 Python 的简洁易读是其在股票交易分析中受欢迎的重要原因之一。Python 的语法简洁明了&#xff0c;与其他编程语言相…

ECharts柱状图-带圆角的堆积柱状图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

【刷题21】BFS解决FloodFill算法专题

目录 一、图像渲染二、岛屿数量三、岛屿的最大面积四、被环绕的区域 一、图像渲染 题目&#xff1a; 思路&#xff1a; 如果起始位置的颜色(数值)与color相同&#xff0c;直接返回该数组上下左右一层一层的找与当前位置颜色相同的&#xff0c;并且该位置不越界&#xff0c;然…

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网&#xff08;http://www.apache.org/dyn/closer.cgi/hive/&#xff09;下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后&#xff0c;需要对文件进行解压。按照Linux系统使用的…