二叉树:递归算法的理解和运用

上一期中,我们了解到了堆,堆的结构也可以叫做二叉树的顺序结构,今天我们一起来看看二叉树的链式结构,我们还要学习有关于二叉树递归的书写。

首先,这是一个二叉树,但是对于普通的二叉树来说,增删查改是没有什么价值的。 

所以那什么才是有价值的呢?

链式二叉树的结构:

我们来看看二叉树的几种遍历:

 我们要怎么实现呢??

我们先来了解以下递归,递归是将一个大问题分解为若干个相似的子问题,同时我们在执行的过程中,要不断接近问题结束的条件。

以前序遍历举例,我们先访问根节点,再进入左子树,进入左子树后访问当前的根节点,也就是左子树,之后以此类推,不断向下访问,结束的调节就是访问到空。

我们可以画图来观察递归调用的结果。

那么中序遍历就是将打印的步骤放在进入左子树后

 解决完这个问题后,我们再来解决:如何计算二叉树结点个数的问题

同样的我们也需要使用递归的方式来实现

我们先来思考我们怎样计数:我们可以仿造先序遍历的方式,进入一个结点就+1,但是我们计数的工具是什么呢???

我们先来看看这种思路

这里他提供了一个静态的变量size来存储个数,但是我们会发现size在定义之后就无法改变,除非我们每一次调用结束后手动将它置为0,所以这是有问题的 。

下面是正确的写法 

我们来看看思路:首先我们先判断这个结点是否为空,为空就返回0,不为空就先往左子树走,左子树为空就向右子树走,都为空就是1个结点,即当前结点加1,一次类推,只要结点不为空,最后都会加1 ,最后计算的结果就是结点个数的和

 下面我们试着来思考:如何利用递归求叶子结点个数???

我们先来思考:什么是叶子结点?

我们要明确的是,叶子结点就是左右子树都为空的结点,那么我们的思路就明了了,一种特殊的结点,当结点为空就返回0。

 

 第四个问题:如何计算二叉树的高度

我们先来看一个二叉树

 它的右子树的高度明显比左子树的高度高。

这里就提示我们左右子树的高度是不一样的,我们要分别记录两个子树的高度,高度是最大的高度,也就是左子树和右子树的高度我们要取最大值。

我们先来看一种错误的写法:

这种写法我们递归返回的时候会重复进行对底层的调用,因为我们不记得左子树和右子树高度的值

 正确的方式我们要将这个函数的返回值利用起来,分别记录左右子树高度,

 

第五题: 计算第k层结点的个数

 谢谢观看,希望对大家有所帮助!!!

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

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

相关文章

【Linux】详谈命令行参数环境变量

目录 一、浅谈命令行参数 二、环境变量 2.1环境变量的内涵以及理解 2.2PATH环境变量: 2.3输入程序名就能运行我们的程序 2.4系统中的环境变量 2.5导出环境变量 三、main函数的第三个参数 3.1获得环境变量的三种方法 四、本地变量 一、浅谈命令行参数 我们的m…

用自己的想法模拟实现库函数(2)完结篇

哈喽,小伙伴们,我们又见面了,上次讲完strlen函数的模拟实现后,发现还比较受大家欢迎,因此,本次给大家带来模拟函数的完结篇。温馨提示:本篇文章将会涉及到可能还未学到的实用性较高的库函数哟。…

Leetcode刷题笔记——动态规划之子序列问题篇

Leetcode刷题笔记——动态规划之子序列问题篇 一、回文 第一题:回文子串 Leetcode647. 回文子串:中等题 (详情点击链接见原题) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着…

案例实践 | 基于长安链的煤质检测智慧实验室

案例名称-煤质检测智慧实验室 ■ 建设单位 国能数智科技开发(北京)有限公司 ■ 用户群体 煤炭生产单位、电力单位、化工单位等产业链上下游单位 ■ 应用成效 化验效率提升50%,出验时间缩短40%,提高化验数据市场公信力 案例…

数据降维 | Matlab实现POD本征正交分解数据降维模型

数据降维 | Matlab实现POD本征正交分解数据降维模型 目录 数据降维 | Matlab实现POD本征正交分解数据降维模型基本介绍模型描述程序设计基本介绍 1.Matlab实现POD本征正交分解数据降维模型(完整源码和数据); 2.运行环境matlab2023; 3.POD降维,POD分解(Proper Orthogonal D…

Lua热更新(Lua)

-- [[]] print 下载Lua For Windows Sublime Text(仅用于演示,实际项目使用VsCode) CtrlB运行 语法基础 基础类型:nil number string boolean 运算符:and-or-not ~ ^ if-then-end-elseif-else while-do-…

数据仓库——雪花模式以及层次递归

层次结构 钻取 向下钻取:对某些代表事实的报表中添加维度细节 向上钻取:从某些代表事实的报表中去除维度细节 属性层次 提供了一种自然方法,用于顺序地在不断深入的层次上组织事实。许多维度可以被理解为包含连续主从关系的属性层次。此类…

Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁

Java深度面试题:设计模式、内存管理与并发编程的综合考察 随着Java技术的不断发展,对Java开发者的技术要求也在不断提高。设计模式、内存管理、多线程工具类以及并发工具包和框架等都是Java开发者必须掌握的核心知识点。本文将通过三道综合性的面试题&a…

只有IP地址怎么实现HTTPS访问?

只有IP地址也可以实现HTTPS访问。虽然大部分SSL证书通常是针对域名发放,但也存在专门针对IP地址发放的SSL证书,这类证书允许服务器通过HTTPS协议为其公网IP地址提供安全的Web服务。当服务器配置了基于IP地址的SSL证书后,用户可以通过“https:…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-字串数字

3725573269 #include<iostream> #include<map> #include<string> using namespace std; int main(){map<char, int> mp;string s "LANQIAO";long long ans 0, power 1;//7位数的26进制可能会超过int范围for(int i 1; i < 26; i){mp.…

深度学习(过拟合 欠拟合)

过拟合&#xff1a; 深度学习模型由于其复杂性&#xff0c;往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法&#xff1a; 1. 数据量不足&#xff1a;深度学习模型通常需要大量的数据来进行训练&#xff0c;如果数据量不足&#xff0c;模型容易过度…

富格林:可信操作实现安全做单

富格林认为&#xff0c;现货黄金最近又又创历史新高了&#xff0c;不少投资者都嗅到其好处跃跃欲试想进场操作一番。但事实上&#xff0c;若希望实现安全做单&#xff0c;还是得要熟练掌握可信的黄金操作技巧。富格林为让大家顺利实现安全交易&#xff0c;特地总结了以下可信操…

vue3怎么使用reactive赋值

使用ref赋值&#xff1a; const list ref([]) const getList async () > {const res await axios.get(/list)list.value res.data } 如何使用reactive来替换呢&#xff1f; //const list ref([]) const list reactive([]) const getList async () > {const res…

NLP 笔记:LDA(训练篇)

1 前言&#xff1a;吉布斯采样 吉布斯采样的基本思想是&#xff0c;通过迭代的方式&#xff0c;逐个维度地更新所有变量的状态 1.1 举例 收拾东西 假设我们现在有一个很乱的屋子&#xff0c;我们不知道东西应该放在哪里&#xff08;绝对位置&#xff09;&#xff0c;但知道哪…

iOS模拟器 Unable to boot the Simulator —— Ficow笔记

本文首发于 Ficow Shen’s Blog&#xff0c;原文地址&#xff1a; iOS模拟器 Unable to boot the Simulator —— Ficow笔记。 内容概览 前言终结模拟器进程命令行改权限清除模拟器缓存总结 前言 iOS模拟器和Xcode一样不靠谱&#xff0c;问题也不少。&#x1f602; 那就有病治…

【Golang星辰图】实现弹性微服务架构:使用go-micro和go-kit构建可扩展的网络应用

构建高效网络应用&#xff1a;探索分布式系统和微服务的利器 前言 在当今的互联网时代&#xff0c;构建可扩展且可靠的网络应用变得越来越重要。分布式系统和微服务架构成为了解决大规模应用程序开发和管理的有效方法。本文将介绍一些用于构建分布式系统和微服务的关键工具和…

鸿蒙Harmony应用开发—ArkTS-ForEach:循环渲染

ForEach基于数组类型数据执行循环渲染。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 接口描述 ForEach(arr: Array,itemGenerator: (item: Array, index?: number) > void,keyGenerator?: (item: Array, index?: number): string …

C#面:简述 .NET Framework 类库中的“命名空间”

在 C# 中&#xff0c;命名空间&#xff08;Namespace&#xff09;是一种用于组织和管理代码的机制。它提供了一种将相关的类、接口、结构体和其他类型组织在一起的方式&#xff0c;以便更好地管理和维护代码。 .NET Framework类库中的命名空间是一种逻辑上的分组&#xff0c;它…

【wails】(10):研究go-llama.cpp项目,但是发现不支持最新的qwen大模型,可以运行llama-2-7b-chat

1&#xff0c;视频演示地址 2&#xff0c;项目地址go-llama.cpp 下载并进行编译&#xff1a; git clone --recurse-submodules https://github.com/go-skynet/go-llama.cpp cd go-llama.cpp make libbinding.a项目中还打了个补丁&#xff1a; 给 编译成功&#xff0c;虽然有…

深度学习 线性神经网络(线性回归 从零开始实现)

介绍&#xff1a; 在线性神经网络中&#xff0c;线性回归是一种常见的任务&#xff0c;用于预测一个连续的数值输出。其目标是根据输入特征来拟合一个线性函数&#xff0c;使得预测值与真实值之间的误差最小化。 线性回归的数学表达式为&#xff1a; y w1x1 w2x2 ... wnxn …