小灰的算法之旅---createBinaryTree 的一点点疑问

news2025/1/11 0:30:30

前言

深知自己算法薄弱,所以最近在补充自己算法方面的知识,《小灰的算法之旅》这本书作为入门书籍不错,当时在看到《树-深度优先遍历》的代码时,我碰到了一点疑问,经过我多次代码验证,确实是代码不太严谨。

问题描述

在用java代码来示例深度优先遍历时,先要构造一个二叉树,书上的构造示例代码如下:

节点代码

构造函数
节点没啥问题,节点本身数据、左孩子、右孩子。但是这个createBinaryTree就有点问题了。是用递归没错,递归的结束条件:inputList这个集合被掏空,但是每次进入递归做的事情:设置左节点,然后进入递归,如此下去,最终会一直往左节点设置,14行的右节点设置本身没用。

口头描述可能有点干瘪,详细描述一下:
输入inputList = {1,2,3,4},调用createBinaryTree方法,运行时,栈空间的大概流程如下:
运行栈空间

圆圈中的序号即代表运行顺序
从主方法调用createBinaryTree方法开始(这步不重要没画),
1:进栈,创建了一个栈帧,inputList为{1,2,3,4},从inputList中拿出1,node1的data(变量为node,为了区分故意加的下标,实际上没有)为1
2:为node1设置左节点,
3:调用方法进栈,
4:进栈,创建了一个栈帧,inputList为{2,3,4},从inputList中拿出2,node2的data为2
5:为node2设置左节点
6:调用方法进栈,
7:进栈,创建了一个栈帧,inputList为{3,4},从inputList中拿出3,node3的data为3
8:为node3设置左节点
9:调用方法进栈,
10:进栈,创建了一个栈帧,inputList为{4},从inputList中拿出4,node4的data为4
11:为node4设置左节点
12:调用方法进栈,
13:进栈,创建了一个栈帧,inputList为{},
14:inputList为空集合触碰到递归的返回条件,返回null
15:方法出栈,retuen null,node4的左节点为null
16:为node4设置右节点,此时inputList已经为空了,所以node4右节点为null。省略图
17:方法正常结束出栈,return node4,node3的左节点为node4
18:为node3设置右节点,此时inputList已经为空了,所以node3右节点为null。
19、20:方法正常结束出栈,return node3,node2的左节点为node3
21:为node2设置右节点,此时inputList已经为空了,所以node2右节点为null。
22、23:方法正常结束出栈,return node2,node1的左节点为node2
24:为node1设置右节点,此时inputList已经为空了,所以node1右节点为null。
25:方法正常结束出栈,return node1。整个递归调用结束,返回头结点node1,

最终的结果:

最终的结果

所以我觉得这个createBinaryTree方法有点不妥。不能说有错,确实是生成了二叉树,而且是生成一种特殊的二叉树:所有结点都只有左节点。表达出了二叉树的多样性。但是,代码不严谨,因为设置右节点的代码是没用的,本身默认值就是null,在这个方法里面,所有设置的右节点也都是null。如果是想生成《所有结点都只有左节点》的二叉树,那何不将设置右节点的代码删除,减少方法调用进栈的次数呢?

改进

经过我改进后的createBinaryTree方法如下:

    /**
     * 生成满二叉树
     * @param height 二叉树的高度
     * @return 二叉树的头结点
     */
    TreeNode<Integer> createBinaryTree(int height){
        TreeNode<Integer> treeNode = new TreeNode<>(new Random().nextInt());
        for (int i = 0; i < height; i++) {
            treeNode.setRightChild(createBinaryTree(i-1));
            treeNode.setLeftChild(createBinaryTree(i-1));
        }
        return treeNode;
    }

当然,这是生成的满二叉树

---------------------------------------------补充------------------------------
书的后面部分有说明,作者是这么用这个递归的:

在这里插入图片描述

这样用的话,确实没问题,还可以按照自己想法构建树,比满二叉树要灵活

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

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

相关文章

C语言基础(有基础)

linux下的 是一种通用的、面向过程式的计算机编程语言 #include <stdio.h> //#include 预处理命令&#xff0c;用来引用头文件&#xff0c; stdio.h 头文件 int main() //开始 {/* 一个注释 */printf("Hello, World! \n");return 0; …

docker安装mysql

在安装Mysql之前&#xff0c;我们可以先查看一下我们的镜像&#xff0c;输入命令&#xff1a; docker images 能发现&#xff0c;镜像里面只有一个Nginx&#xff0c;并没有Mysql 然后我们可以像上一篇安装Nginx一样&#xff0c;安装Mysql镜像。 输入以下命令&#xff0c;安装…

B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)

课程来源&#xff1a;一天搞定人脸识别项目&#xff01;学不会up直接下跪&#xff01;&#xff08;pythonopencv&#xff09;_哔哩哔哩_bilibili 图片来源&#xff1a;感谢王鹤棣先生友情出镜~ 环境配置详见&#xff1a; 在conda虚拟环境中安装OpenCv并在pycharm中使用_cond…

已解决io.UnsupportedOperation: not readable

已解决Python读取文件报错&#xff1a;io.UnsupportedOperation: not readable亲测有效 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 一个小伙伴遇到问题跑来私信我&#xff0c;想用Python读取文件&#xff0c;但是发生了报错&#xff08;当时他…

跟同事杠上了,Apache Beanutils为什么被禁止使用?

收录于热门专栏Java基础教程系列&#xff08;进阶篇&#xff09; 在实际的项目开发中&#xff0c;对象间赋值普遍存在&#xff0c;随着双十一、秒杀等电商过程愈加复杂&#xff0c;数据量也在不断攀升&#xff0c;效率问题&#xff0c;浮出水面。 问&#xff1a;如果是你来写…

Redis过期删除策略

目录引出Redis过期删除策略Redis的两种过期策略&#xff1a;定期删除 惰性删除定期删除惰性删除Redis两种过期删除策略存在的问题Redis缓存淘汰策略Redis中的LRU和LFU算法1、LRU&#xff08;Least Recently Userd最近最少使用&#xff09;LFU 算法的引入2、LFU&#xff08;lea…

Netty 组件学习

Netty 组件学习Netty 各个组件通俗理解EventLoopEventLoopGroup关闭ChannelFuture & PromiseHandler & PipelineByteBuf创建直接内存和堆内存池化和非池化组成方法扩容机制读取retain和release方法Netty 各个组件通俗理解 Channel即数据通道 Msg是数据&#xff0c;传…

对KMP简单的理解

声明&#xff1a;下边的例子均表示下标从1开始的数组 ne数组的定义&#xff1a; next[i] 就是使子串 s[1…i] 有最长相等前后缀的前缀的最后一位的下标。ne[i]也可以表示相等子串的长度 准备执行jne[j]时&#xff0c; 表示当前s[i]!p[j1] , 如果ne[j]1 &#xff0c;那么下…

Dubbo和Zookeeper集成分布式系统快速入门

文件结构 代码部分 1、新建provider-server导入pom依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</version></dependency><dependency>&l…

golang的web框架Gin(一)---Gin的安装与初体验

简介 1.1 介绍 Go世界里最流行的Web框架&#xff0c;Github上有32Kstar。 基于httprouter开发的Web框架。 中文文档齐全&#xff0c;简单易用的轻量级框架。 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有…

C++模板初阶

C模板初阶泛型编程函数模板概念函数模板格式函数模板原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程 我们前面学习了C的函数重载功能&#xff0c;那么我们如何实现一个通用的交换函数呢&#xff0c;比如:我传入int就是交换int&#xff…

JavaSE XML语法规则和文档约束介绍

文章目录XMLXML基本介绍XML创建和语法规则XML文档约束认识文档约束DTD约束(了解)schema约束(了解)XML XML基本介绍 XML概述: XML是可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;的缩写&#xff0c;它是一种可以自定义数据的表示格式&#xff0c;可以描述…

【mysql数据库】

目录SQL数据库分页聚合函数表跟表之间的关联关系SQL中怎么将行转成列SQL注入将一张表的部分数据更新到另一张表WHERE和HAVING的区别索引索引分类如何创建及保存MySQL的索引&#xff1f;怎么判断要不要加索引&#xff1f;索引设计原理只要创建了索引&#xff0c;就一定会走索引吗…

ESP-01S通过AT指令上报数据到阿里云物模型

ESP-01S使用AT指令上报数据到阿里云物模型 上篇文章介绍了如何用AT指令连接阿里云并进行通信&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/128995530 但最终需要将传感器数据上报到云平台显示&#xff0c;所以需要建立阿里云物模型 阿里云平台建立物…

代码随想录第62天(单调栈):● 739. 每日温度 ● 496.下一个更大元素 I

今天开启单调栈的篇章&#xff0c;一般什么时候采用单调栈&#xff1f;通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。 一、每日温度 题目描述&#xff1a; 思路和想法&#xff1a; 这里单调栈里只放数组下标&#xff0c;再了…

删除Android Studio中重复的JDK配置

问题 可能因为一些不经意的操作&#xff0c;导致如下这种情况&#xff1a;出现多余重复的JDK路径配置&#xff0c;其实指向的是同一个路径。 强迫症犯了之后&#xff0c;就会想怎么干掉这个&#xff08;2&#xff09;。 解决 第一步&#xff1a;先打开你最近打开的项目&…

开篇之作——闲聊几句AUTOSAR(2)

开篇之作——闲聊几句AUTOSAR 我是穿拖鞋的汉子,魔都中坚持长期主义的工科男! 在上一篇文章中主要介绍了啥是AUTOSAR,AUTOSAR要干点啥,以及AUTOSAR的发展历史。接下来在本文中将继续介绍: -> AUTOSAR的合作伙伴关系; -> 组织架构; -> 基础标准规范。 言归正…

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试&#xff1f; 鄙人之前也不知道&#xff0c;网上搜了一下&#xff0c;看到的几篇文章都是要使用代理&#xff0c;有用Nginx的&#xff0c;还有自己写代理的。主要是按照步骤做了并不行。于是自己折腾了一下&#x…

缓存中间件Caffeine超详细源码解读

读源码是一件非常复杂、困难、枯燥的过程&#xff0c;这个复杂过程我给大家踩了&#xff0c;各位看官躺平看就行啦初始化入口&#xff1a;//典型的工厂模式&#xff0c;初始化一个caffeine对象 Caffeine.newBuilder();CheckReturnValue public static Caffeine<Object, Obje…

(考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;IPv4地址概述二&#xff1a;IPv4地址表示方法&#xff08;1&#xff09;概述&#xff08;2&#xff09;8位无符号二进制数转十进制正整数&#xff…