二叉树的递归详解:以例题计算二叉树第k层为例

1.代码速览

1.1节点的构建

#include<iostream>
using namespace std;
class ListNode
{
public:friend void fun();friend int TreeKLevel(ListNode* root, int k);ListNode(int val):_val(val),leftnext(nullptr),rightnext(nullptr){}
private:int _val = 0;class ListNode* leftnext;class ListNode* rightnext;
};

1.2二叉树的创建

void fun()
{ListNode* n1 = new ListNode(1);ListNode* n2 = new ListNode(2);ListNode* n3 = new ListNode(3);ListNode* n4 = new ListNode(4);ListNode* n5 = new ListNode(5);n1->leftnext = n2;n2->leftnext = n3;n2->rightnext = n5;n1->rightnext = n4;// 假设我们要计算第3层的节点数  int level2Nodes = TreeKLevel(n1, 3);cout << level2Nodes << endl;delete n1;delete n2;delete n3;delete n4;delete n5;
}

1.3计算第K层节点的个数

int TreeKLevel(ListNode* root, int k)
{if (root == nullptr)return 0;if (k == 1)return 1;int leftk = TreeKLevel(root->leftnext, k - 1);int rightk = TreeKLevel(root->rightnext, k - 1);return leftk + rightk;
}

2.代码详解

2.1函数栈帧的创建

数的栈帧(Stack Frame)是程序运行时在调用栈(Call Stack)上分配的一个内存块,用于存储函数执行时的局部变量、参数、返回地址等信息。当函数被调用时,一个新的栈帧会被创建并压入调用栈的顶部;当函数执行完毕并返回时,其对应的栈帧会被销毁并从调用栈中弹出。即函数每次被调用的时候,都会创建一个栈帧.

2.2函数栈帧的弹出

在一个函数执行完其return语句之后,这个函数栈帧便会被弹出,执行的下一个语句便会回到函数上一次被调用的地方.

2.3函数递归调用图示

2.4叙述此段代码运行逻辑

这段代码开始运行,其参数列表接收由程序员传递过来的树的根部root以及目标层数k

在运行的过程中,先碰到    int leftk = TreeKLevel(root->leftnext, k - 1);        后,会进行一下函数的调用,根据函数的栈帧的相关知识,函数在调用的同时候会开辟新的栈帧,并接着在当前开辟的栈帧中运行,与此同时,k也会减去1,在此代码    int leftk = TreeKLevel(root->leftnext, k - 1);不断进行调用开辟栈帧的同时,k最终也会减到"1",此时将会执行代码

遇到return 1;遇到return语句后,会弹出当前的栈帧并且回到上一次调用的地方

int leftk = TreeKLevel(root->leftnext, k - 1);并且将刚才的return 1中的1返回并且赋值给int leftk并使用left进行保存,之后便是    int rightk = TreeKLevel(root->rightnext, k - 1);的调用,在每次调用这个函数并且开辟栈帧对每一个节点的left子树进行遍历的时候,return的值会被返回给int rightk然后在每一个父节点的栈帧中,使用return lefk+rightk对它的左右子树进行节点个数的相加,然后依靠return再返回给上一个栈帧的leftk或者rightk,用这个思路最后可以得出第k层的节点个数

2.5使用画图的方法进行更形象的说明

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

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

相关文章

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…

Codeforces Round 943 (Div. 3)A-D

div3补提 https://codeforces.com/contest/1968 A&#xff1a;需要求gcd(x,y)y的最大值,给的范围只有1-1000&#xff0c;可以直接暴力来做。 求最大公约数的代码gcd&#xff0c;如果x<y,需要叫交换x和y的值&#xff0c;如果y等于0&#xff0c;就返回x&#xff0c;用递归的形…

240503-关于VisualStudio2022社区版的二三事

240503-关于VisualStudio2022社区版的二三事 1 常用快捷键 快捷键描述AltEnter选中代码片段以提取方法Alt上下箭头移动选中的代码片段F12转到方法定义CtrlR*2批量修改选中的变量名称 2 自动生成构造函数 3 快速重写父类方法 4 节约时间&#xff1a;写代码使用“头插法”&…

Python面试十问2

一、如何使用列表创建⼀个DataFrame # 导入pandas库 import pandas as pd# 创建一个列表&#xff0c;其中包含数据 data [[A, 1], [B, 2], [C, 3]]# 使用pandas的DataFrame()函数将列表转换为DataFrame df pd.DataFrame(data, columns[Letter, Number]) # 列名# 显示创建的…

华为OD机试 - 会议室占用时间段(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

matlab绘制散点图

在MATLAB中&#xff0c;可以使用scatter函数来绘制散点图。下面是一个简单的例子&#xff0c;说明如何使用scatter函数来绘制散点图。 假设你有一组x坐标和一组y坐标&#xff0c;你想在图上绘制它们&#xff1a; % 创建x和y的随机数据 x randn(1, 100); % 从正态分布中生成…

【iOS】pthread、NSThread

文章目录 前言一、pthread 使用方法pthread 其他相关方法 二、 NSThread创建、启动线程线程相关用法线程状态控制方法NSThread 线程安全和线程同步场景 线程的状态转换 前言 五一这两天准备将GCD相关的知识完&#xff0c;同时NSOperation与NSThread、pthread也是相关知识&…

前端Web开发基础知识

HTML定义 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 什么是 HTML? HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup LanguageH…

汇编语言——比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示MATCH, 不相同则显示NO MATCH

CMPS 串比较指令&#xff1a; CMPS SRC, DST CMPSB &#xff08;字节&#xff09; CMPSW &#xff08;字&#xff09; 执行操作&#xff1a; ((SI)) - ((DI)) 根据比较结果置条件标志位&#xff1a;相等 ZF1&#xff1b;不等 ZF0 字节操作&#xff1a;(SI)←(SI)1, (DI)←(DI…

如何进行Furion项目的单元测试

进行Furion项目的单元测试的步骤如下&#xff1a; 步骤1&#xff1a;在Furion项目中创建单元测试项目 - 在Furion项目的解决方案中右键单击并选择“添加” -> “新项目” - 在“创建新项目”对话框中&#xff0c;在搜索框中输入“单元测试”&#xff0c;然后选择“单元测试…

window 安装ai 基础环境(yolo8,训练推理等)

步骤: 1. python sdk 3.9以上 2. 显卡驱动 可以使用驱动精灵 直接安装N 卡推荐 3. 安装机器学习套件CUDA cuda 安装在PyTorch 需要根 PyTorch版本一致&#xff0c;我的 win-srv 最高支持 12.1 下载地址&#xff1a; https://developer.nvidia.com/cuda-toolkit-archive…

数据结构——循环结构:for循环

今天是星期五&#xff0c;明天休息&#xff0c;后天补课&#xff0c;然后就是运动会&#xff0c;接着是放假。&#xff08;但这些都和我没关系啊&#xff0c;哭死&#xff01;&#xff09;今天脑袋难得清醒一会儿&#xff0c;主要是醒的比较早吧&#xff0c;早起学了一会&#…

汇编语言——输入两个字数据(16位的数)X,Y,计算Z=X+Y,并把Z的结果显示出来

文章目录 以2进制输入&#xff0c;2进制输出&#xff08;无符号&#xff09;以2进制输入&#xff0c;2进制输出&#xff08;带符号&#xff09;以8进制输入&#xff0c;8进制输出以10进制输入&#xff0c;10进制输出以16进制输入&#xff0c;16进制输出 仅供参考 X、Y的输入可…

Spring MVC 中配置 DispatcherServlet

在Spring MVC中&#xff0c;DispatcherServlet 是前端控制器&#xff0c;负责处理所有的HTTP请求。它是整个Spring MVC框架的核心组件&#xff0c;负责将请求分派给相应的处理器。以下是如何配置DispatcherServlet的详细步骤&#xff1a; 添加依赖&#xff1a; 确保项目中包含…

Windows系统启动Redis

一、下载windows版本Redis 1.1 选择一个使用的版本 在以下地址中选择一个Windows系统可以使用的版本 https://github.com/microsoftarchive/redis/tags 1.2 下载 1.3 解压到文件夹 二、启动Redis 双击redis-server.exe启动Redis 出现以下界面即启动成功 三、测试是否可以使…

Linux第二节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;&#xff0c;本节涉及初识Linux第二节&#xff0c;主要为常见的几条指令介绍。 Linux下基本指令 1. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#…

php 追加 内容

目录 1. 追加到文件末尾2. 追加到数据库表中3. 追加到数组 在 PHP 中实现数据追加功能通常涉及将新数据添加到已有数据中&#xff0c;比如将新内容附加到文件末尾或将新数据添加到数据库表中。以下是一些常见的实现方式&#xff1a; 1. 追加到文件末尾 追加文字到文件&#xf…

LeetCode //C - 60. Permutation Sequence

60. Permutation Sequence The set [1, 2, 3, …, n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, we get the following sequence for n 3: “123”“132”“213”“231”“312”“321” Given n and k, re…

某米社区请求data类型multipart_form-data分析

随笔记录 之前未曾遇到请求的Content-Type:multipart/form-data; boundary=----WebKitFormBoundary9Fxpi3Dvlnhm3MKq,今天就简单是根据目标网站进行分析下,目标站点是:aHR0cHM6Ly93ZWIudmlwLm1pdWkuY29tL3BhZ2UvaW5mby9taW8vbWlvL3BjU2VhcmNoP2Zyb21QYXRobmFtZT1taW9Cb2FyZ…

边缘计算含义与应用简析

边缘计算概述 边缘计算使数据存储和处理靠近生成或收集数据的位置&#xff0c;而不是在位于数千公里的服务器上。它将通过保持灵活性在边缘无缝可靠地部署服务。它比云计算更安全&#xff0c;因为不需要传输数据。因此&#xff0c;在将数据从边缘移动到云端时&#xff0c;不用…