【数据结构】——二叉树特点

前言:我们前面已经了解了二叉树的一些概念,那么我们今天就来了解下二叉树的遍历实现和一些性质。

在这里插入图片描述

二叉树的遍历方式有三种:前序中序后序

前序:先根节点,再左子树,最后右子树。
中序:先左子树,再根节点,最后右子树。
后序:先左子树,再右子树,最后根节点。

前序遍历:

void PrevOrder(TreeNode* root)
{if (root == NULL){printf("N ");return;}printf("%d ", root->data);PrevOrder(root->left);PrevOrder(root->right);
}

如果我们的根节点为空就返回空,不为空就递归左子树,如果左子树为空就返回递归访问右子树。

中序遍历:

void InOrder(TreeNode* root)
{if (root == NULL){printf("N");return;}InOrder(root->left);printf("%d ", root->data);InOrder(root->right);
}

先访问遍历左子树,再根节点,最后在访问右子树。

后序遍历:

void Tailorder(TreeNode* root)
{if (root == NULL){printf("N");return;}Tailorder(root->left);Tailorder(root->right);printf("%d", root->data);
}

先遍历左子树,再遍历右子树,最后在根节点。

求二叉树节点个数:

int TreeSize(TreeNode* root)
{return root == NULL ? 0 :TreeSize(root->left) +TreeSize(root->right) + 1;
}

我们递归实现,左子树的节点个数加上右子树的节点个数再加上根节点的个数就是节点的总个数。
在这里插入图片描述

求叶子结点的个数:

int TreeLeafSize(TreeNode* root)
{// 空 返回0if (root == NULL)return 0;// 不是空,是叶子 返回1if (root->left == NULL&& root->right == NULL)return 1;// 不是空 也不是叶子  分治=左右子树叶子之和return TreeLeafSize(root->left) +TreeLeafSize(root->right);
}

求二叉树的高度:

int TreeHeight(TreeNode* root)
{if (root == NULL)return 0;int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

因为我们的递归结合上三目操作符会使得非常的复杂,所以我们用一个数据来保存左右子树的高度,我们的二叉树的高度为左右子树较高的那个子树加上1,所以我们返回的是左右子树高度更高的再加上1就是二叉树的高度。

我们的代码还可以进行改进,我们C语言的fmax函数:该函数的作用是比较两个数得到较大的那一个数

int TreeHeight(TreeNode* root)
{if (root == NULL)return 0;return fmax(TreeHeight(root->left), TreeHeight(root->right)) + 1;
}

求二叉树第k层节点个数:

int TreeLevelK(TreeNode* root, int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1)return 1;return TreeLevelK(root->left, k - 1)+ TreeLevelK(root->right, k - 1);
}

第k层的节点等于第k-1层的节点数相加。
在这里插入图片描述
现在我们要求第三层的节点数,相当于我们返回它的第二层,而我们的第二层节点数要返回我们的第一层节点数,我们的左子树返回一个节点,右子树返回两个节点,所以就是三个节点。

如果对大家有所帮助的话就支持一下吧!

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

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

相关文章

husky \ lint-staged \ commitlint 实现代码提交前检查

话不多说,直接上步骤: 1、安装husky pnpm install husky -D 2、在 package.json 的 script 添加命令 "scripts": {"prepare": "husky install" } 3、执行 pnpm run prepare 执行完项目根目录也会出现一个.husky文件…

绘制6层及以上PCB板,需要明白PCB板的结构和叠层

PCB主要由PP半固化片和core芯板压合而成,其中core芯板两面都有铜箔,是PCB板的导电介质;PP半固化片是绝缘材料,用于芯板的粘合。 在PP半固化片被层压后,其环氧树脂被挤压开来,将core芯板粘合在一起。 PCB的叠…

Python代码将txt里面多行json字符串转成excel文件

python 代码 将txt里面的多行json字符串转成excel history.txt文件json代码样例 Json转换Excel代码 import json import pandas as pddef json_out(file_path,excel_path):all_list[]with open(file_path, "r", encodingutf-8) as f:for line in f:all_list.append…

Tuxera NTFS2024安装包下载教程

在听到小凡的电话说“Tuxera NTFS for Mac软件安装失败,怎么办”的时候,小编心里真像有一万头草泥马在奔腾——苹果软件还能安装失败!? 挥手把一万头草泥马赶走,脑补着苹果软件的安装,小编对着电话吼道&am…

开发相关论文收录

深度学习相关 https://download.csdn.net/download/zhaohad/88603183

配置主机与外网时间服务器同步时间

目录 NTP服务简介 时间管理命令 第一步:更改当前主机所在地的时间 方法一:使用tzselect命令查询需要的时区 1、使用tzselect命令查询需要的时区 2、添加变量到 ~/.bash_profile 文件中,即追加类似的内容: 3、重新连接一个…

LLM大语言模型(一):ChatGLM3-6B本地部署

目录 前言 本机环境 ChatGLM3代码库下载 模型文件下载 修改为从本地模型文件启动 启动模型网页版对话demo 超参数设置 GPU资源使用情况 (网页对话非常流畅) 前言 LLM大语言模型工程化,在本地搭建一套开源的LLM,方便后续的…

提取和计算特定时间范围内的日志行数

提取和计算特定时间范围内的日志行数 提取和计算特定时间范围内的日志行数通常需要结合日志中的时间戳以及一些文本处理命令。以下是一个简单的示例,假设日志文件中的时间戳格式为 YYYY-MM-DD HH:mm:ss: #!/bin/bash# 指定特定时间范围 start_time&quo…

深入了解UUID:生成、应用与优势

一、引言 在当今数字化时代,唯一标识一个对象的能力变得越来越重要。UUID(Universally Unique Identifier,通用唯一标识符)应运而生,作为一种保证全球唯一性的标识方法,广泛应用于各种场景。本文将详细介绍…

HTML程序大全(2):通用注册模版

一、正常情况效果 二、某项没有填写的效果 三、没有勾选同意项的效果 四、代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>注册</title><style>body {font-family: Arial, sans-serif;background-color…

21章网络通信

21.1——网络程序设计基础 网络程序设计编写得到是与其他计算机进行通信的程序 21.1.1——局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机 21.1.2——网络协议 网络协议规定了计算机之间连接的物理、机械 (网线与网卡的连接规定)、…

Unity的坐标系统及它们互相转换的方法

在Unity中&#xff0c;常用的坐标系统有以下这些&#xff1a; 屏幕坐标&#xff08;Screen Space&#xff09;&#xff1a;屏幕坐标是基于屏幕的坐标系统&#xff0c;是2D坐标系&#xff0c;原点位于屏幕左下角&#xff0c;x轴向右延伸&#xff0c;y轴向上延伸。屏幕坐标通常用…

「智慧城市」这一概念科学吗?还是炒作?

智慧城市是一个综合性的概念&#xff0c;它利用信息技术和创新概念&#xff0c;将城市的各个系统和服务集成起来&#xff0c;以提升城市运行效率、优化城市管理和服务&#xff0c;改善市民的生活质量。 具体来说&#xff0c;智慧城市涵盖了许多领域&#xff0c;包括城市规划、建…

通过仿真理解信道化接收机分析过程

概要 信道化从子信道带宽划分上可分为临界抽取和非临界抽取两种&#xff0c;从各子信道中心频率布局上可分为偶型排列和奇型排列&#xff0c;从处理流程上可分为信道化分析与信道化综合过程。本文主要通过仿真来理解偶型排列/临界抽取/信道化分析过程。 基本原理 常规的数字…

ESP32网络开发实例-发送邮件

发送邮件 文章目录 发送邮件1、邮件发送配置2、软件准备3、硬件准备4、代码实现本文将详细介绍在ESP32中如何使用SMTP协议发送邮件。 1、邮件发送配置 在本次实例中,我们将通过QQ邮箱向指定邮件地址发送邮件。 第一步,注册QQ邮箱 第二步,开启QQ邮箱SMTP/IMAP 服务: 生成…

6.1810: Operating System Engineering 2023 <Lab4 traps: Traps>

一、本节任务 二、要点&#xff08;Traps and system calls&#xff09; 有三种事件会使 CPU 暂停当前的指令执行&#xff0c;并强制将控制转移到处理该事件的特殊代码中&#xff1a; 系统调用&#xff08;ecall&#xff09;&#xff1b;异常&#xff08;如非法指令&#xff…

重磅!苹果官方发布大模型框架:一个可以充分利用苹果统一内存的新的大模型框架MLX,你的MacBook可以一键运行LLaMA了

本文来自DataLearnerAI官方网站&#xff1a;重磅&#xff01;苹果官方发布大模型框架&#xff1a;一个可以充分利用苹果统一内存的新的大模型框架MLX&#xff0c;你的MacBook可以一键运行LLaMA了 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/105170187…

Java 输入输出流03

8. 字符流 Writer/Reader Java 中字符是采用 Unicode 标准&#xff0c;一个字符是 16 位&#xff0c;即一个字符使用两个字节来表示。为此&#xff0c;JAVA 中引入了处理字符的流。 1&#xff09;Reader抽象类 用于读取字符流的抽象类。子类必须实现的方法只有 read (char [],…

“数”说新语向未来 | GBASE南大通用2023媒体交流会成功举办

在当前国家信创战略加速实施&#xff0c;及国民经济数字化转型&#xff0c;叠加驱动信息化行业加速发展的大形势下&#xff0c;以“数说新语-GBASE南大通用开放创新再领航”为主题的2023 GBASE南大通用媒体交流日活动在GBASE天津总部举行。来自IT168、ITPUB、韩锋频道、自主可控…

海思SD3403/SS928V100开发(11)双网卡同网段外部回环搭建测试

1. 前言 网卡eth0: 内部自带网卡 网卡eth1: USB扩展网卡 需要通过将eth0和eth1设置成相同网段IP, 通过外部网络互联进行老化测试 问题: Linux的内核对从一个网络地址发往另一个网络地址的数据包,如 果这两个网络地址同属一个host,则这个数据包会直接在内部转发,根本…