二叉树的递归详解:以例题计算二叉树第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/…

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

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

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

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

【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…

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的输入可…

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;该命令列出该目录下的所有子目录与文件。对于文件&#…

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

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

边缘计算含义与应用简析

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

eSIM Network搭建指南

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot).

用自动化工具轻松吸引更多粉丝关注

在当今这个信息爆炸的时代&#xff0c;如何让自己的品牌、产品或者个人在众多信息中脱颖而出&#xff0c;吸引更多的粉丝关注&#xff0c;成为了许多人面临的问题。而自动化工具&#xff0c;就是我们解决这个问题的利器。 首先&#xff0c;我们要明白&#xff0c;吸引粉丝关注…

【笔记】Simulink与Workbench交互+自定义m函数封装为Simulink模块

以如下三角函数为例&#xff0c;说明建模方法 ya*sin(b*2*pi*uc);0.总模型总代码 总模型 总代码&#xff1a; clc clear close allt_all10; a10; b1; c0;%pi/2; delta_t0.01; simOutsim(test240430); out_tsimOut.tout; out_y1simOut.yout{1}.Values; out_y2simOut.yout{2}.…

【C 数据结构】深度优先搜索、广度优先搜索

文章目录 【 1. DFS 深度优先搜索 】1.1 基本原理1.2 C 实现 【 2. BFS 广度优先搜索 】2.1 基本原理2.2 C 实现 【 3. 深度优先生成树、广度优先生成树 】【 4. 深度优先生成森林、广度优先生成森林 】4.1 深度优先生成森林4.2 广度优先生成森林 对存储的图中的顶点进行遍历搜…

告诉我们事实:用知识图谱增强大语言模型以实现事实感知的语言建模

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;Give Us the Facts: Enhancing Large Language Models with Knowledge Graphs for Fact-aware Language Modeling 论文链接&#xff1a;https://arxiv.org/abs/2306.11489 论文作…

O2OA开发平台前端源码级二次开发(Vue3,React)

在使用O2OA进行项目定制化开发时&#xff0c;我们可以开发新的前端组件&#xff08;x_component&#xff09;以扩展O2OA来实现更多的业务。这种新增前端组件或者前端业务的开发通常会配合后端自定义应用实现的服务来完成系统内数据的交互。在当系统默认的界面不符合系统UI/UE设…

leetcode84柱状图中最大的矩形

题解&#xff1a; - 力扣&#xff08;LeetCode&#xff09; class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack new Stack<>();int maxArea Integer.MIN_VALUE;for(int i 0;i < heights.length;i){int curHeight hei…