递归可视化尝试(1)--CLI版:以计算二叉树的深度为例

后续会写其他版本(streamlit版/turtle版等等)
这个CLI版指用print来帮助理解

计算二叉树的深度python代码简洁版

  • 如下

    class Node:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef max_depth(root):if not root:return 0left_depth = max_depth(root.left)right_depth = max_depth(root.right)return max(left_depth, right_depth) + 1# 示例用法
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)
    root.left.left.left = Node(6)print("二叉树的深度为:", max_depth(root))
    

print通俗易懂版!

帮助你从递归里绕出来~

"""
下面的例子树是:1/ \2   3/ \4   5/6
"""class Node:def __init__(self, value):self.value = valueself.left = Noneself.right = Nonedef print_separator(char="-", length=50):"""打印分隔符"""print(char * length)def max_depth(root, parent=None, direction=None):if not root:if parent:print_separator("=")print(f"max_depth(None)开始递归,此为节点{parent.value}{direction}子树")else:print_separator("=")print("max_depth(None)开始递归")print("max_depth(None)结束,返回值为:0")print_separator("=")return 0if parent:print_separator()print(f"从节点{parent.value}进入其{direction}子节点{root.value}")print_separator("=")print(f"max_depth({root.value})开始递归")left_depth = max_depth(root.left, root, "左")right_depth = max_depth(root.right, root, "右")print(f"节点{root.value}的左子树深度为:{left_depth}")print(f"节点{root.value}的右子树深度为:{right_depth}")result = max(left_depth, right_depth) + 1print(f"取其最大值,所以节点{root.value}的深度为:{result}")print(f"max_depth({root.value})结束,返回值为:{result}")if parent:print(f"从节点{root.value}返回节点{parent.value},继续调用max_depth")print_separator("=")return result# 示例用法
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.left.left.left = Node(6)print("计算二叉树深度:")
print_separator("*", 60)
print("二叉树的深度为:", max_depth(root))
print_separator("*", 60)

可视化效果


计算二叉树深度:
************************************************************
==================================================
max_depth(1)开始递归
--------------------------------------------------
从节点1进入其左子节点2
==================================================
max_depth(2)开始递归
--------------------------------------------------
从节点2进入其左子节点4
==================================================
max_depth(4)开始递归
--------------------------------------------------
从节点4进入其左子节点6
==================================================
max_depth(6)开始递归
==================================================
max_depth(None)开始递归,此为节点6的左子树
max_depth(None)结束,返回值为:0
==================================================
==================================================
max_depth(None)开始递归,此为节点6的右子树
max_depth(None)结束,返回值为:0
==================================================
节点6的左子树深度为:0
节点6的右子树深度为:0
取其最大值,所以节点6的深度为:1
max_depth(6)结束,返回值为:1
从节点6返回节点4,继续调用max_depth
==================================================
==================================================
max_depth(None)开始递归,此为节点4的右子树
max_depth(None)结束,返回值为:0
==================================================
节点4的左子树深度为:1
节点4的右子树深度为:0
取其最大值,所以节点4的深度为:2
max_depth(4)结束,返回值为:2
从节点4返回节点2,继续调用max_depth
==================================================
--------------------------------------------------
从节点2进入其右子节点5
==================================================
max_depth(5)开始递归
==================================================
max_depth(None)开始递归,此为节点5的左子树
max_depth(None)结束,返回值为:0
==================================================
==================================================
max_depth(None)开始递归,此为节点5的右子树
max_depth(None)结束,返回值为:0
==================================================
节点5的左子树深度为:0
节点5的右子树深度为:0
取其最大值,所以节点5的深度为:1
max_depth(5)结束,返回值为:1
从节点5返回节点2,继续调用max_depth
==================================================
节点2的左子树深度为:2
节点2的右子树深度为:1
取其最大值,所以节点2的深度为:3
max_depth(2)结束,返回值为:3
从节点2返回节点1,继续调用max_depth
==================================================
--------------------------------------------------
从节点1进入其右子节点3
==================================================
max_depth(3)开始递归
==================================================
max_depth(None)开始递归,此为节点3的左子树
max_depth(None)结束,返回值为:0
==================================================
==================================================
max_depth(None)开始递归,此为节点3的右子树
max_depth(None)结束,返回值为:0
==================================================
节点3的左子树深度为:0
节点3的右子树深度为:0
取其最大值,所以节点3的深度为:1
max_depth(3)结束,返回值为:1
从节点3返回节点1,继续调用max_depth
==================================================
节点1的左子树深度为:3
节点1的右子树深度为:1
取其最大值,所以节点1的深度为:4
max_depth(1)结束,返回值为:4
==================================================
二叉树的深度为: 4
************************************************************

添加的这些print语句分别是基于何种动机?

1.开始/结束递归的打印语句:

print(f"max_depth({root.value})开始递归")print(f"max_depth({root.value})结束,返回值为:{result}")
这两条语句用于标记每次递归调用的开始和结束。这有助于我们跟踪函数何时开始处理一个新的节点以及何时完成处理。

2.递归终止条件的打印语句:

当函数递归到一个空节点时,输出"max_depth(None)开始递归"。这让我们可以看到函数如何处理叶节点(叶节点没有子节点,或者是叶节点的子节点是空的)

3.打印当前节点的左/右子树深度:

print(f"节点{root.value}的左子树深度为:{left_depth}")print(f"节点{root.value}的右子树深度为:{right_depth}")
这两条语句可以显示一个节点的左右子树的深度。有助于我们理解某个节点的深度(max(左,右)+1)

4.显示计算结果:

print(f"取其最大值,所以节点{root.value}的深度为:{result}") 显示当前节点的深度。
我们知道节点的深度是其左右子树深度的最大值加1,这个打印语句就是为了验证这一点。

5.递归导航的打印语句:

print(f"从节点{parent.value}进入其{direction}子节点{root.value}")print(f"从节点{root.value}返回节点{parent.value},继续调用max_depth")
这两条语句帮助我们跟踪函数在递归树中的导航路径。当函数从一个节点跳转到其子节点或返回到父节点时,这些语句都会输出。

6.分隔符的打印语句:

print_separator("=") 这个函数调用打印一个分隔线,使输出更加有条理。

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

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

相关文章

线性表的链式存储结构——链表

一、顺序表优缺点 优点:我们知道顺序表结构简单,便于随机访问表中任一元素; 缺点:顺序存储结构不利于插入和删除,不利于扩充,也容易造成空间浪费。 二、链表的定义 ①:概念: 用一组任…

Springboot+vue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的在线试题题库管理系统(有报告),Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的在线试题题库管理系统,采用M&…

PHP 数码公司运营管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 数码公司运营管理系统系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php 数码公司运营管理系统 代码 https://download.csdn.net/download/qq_41…

基于 jasypt 实现spring boot 配置文件脱敏

前言 在项目构建过程中,保护敏感信息的安全性至关重要,为了提高系统的安全性能,我们采用了Jasypt来对配置文件中的敏感信息进行加密处理,以确保系统的机密信息不被轻易泄露。 步骤 添加Maven依赖 首先,我们需要添加…

【kubernetes】kubernetes中的StatefulSet使用

TOC 1 为什么需要StatefulSet 常规的应用通常使用Deployment,如果需要在所有机器上部署则使用DaemonSet,但是有这样一类应用,它们在运行时需要存储一些数据,并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取&…

buuctf-[Zer0pts2020]Can you guess it?

点击source&#xff0c;进入源代码 <?php include config.php; // FLAG is defined in config.phpif (preg_match(/config\.php\/*$/i, $_SERVER[PHP_SELF])) {exit("I dont know what you are thinking, but I wont let you read it :)"); }if (isset($_GET[so…

【算法学习】-【双指针】-【复写零】

LeetCode原题链接&#xff1a;1089. 复写零 下面是题目描述&#xff1a; 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 …

【浅记】分而治之

归并排序 算法流程&#xff1a; 将数组A[1,n]排序问题分解为A[1,n/2]和A[n/21,n]排序问题递归解决子问题得到两个有序的子数组将两个子数组合并为一个有序数组 符合分而治之的思想&#xff1a; 分解原问题解决子问题合并问题解 递归式求解 递归树法 用树的形式表示抽象递…

7.网络原理之TCP_IP(下)

文章目录 4.传输层重点协议4.1TCP协议4.1.1TCP协议段格式4.1.2TCP原理4.1.2.1确认应答机制 ACK&#xff08;安全机制&#xff09;4.1.2.2超时重传机制&#xff08;安全机制&#xff09;4.1.2.3连接管理机制&#xff08;安全机制&#xff09;4.1.2.4滑动窗口&#xff08;效率机制…

uni-app:实现元素在屏幕中的居中(绝对定位absolute)

一、实现水平居中 效果 代码 <template><view><view class"center">我需要居中</view></view> </template><style>.center {position: absolute;left:50%;transform: translateX(-50%);border:1px solid black;} </s…

freertos简介与移植

freertos是一个可裁剪的小型rtos系统&#xff0c;特点&#xff1a; 支持抢占式&#xff0c;合作式和时间片调度saferos衍生自freertos&#xff0c;更完整提供了一个用于低功耗的tickless模式系统的组件在创建时可以选择动态或者静态的ram&#xff0c;例如任务&#xff0c;消息…

快排三种递归及其优化,非递归和三路划分

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 快排简介&#xff1a; 快排的三种递归实现&#xff1a; Hoare&#xff1a; 挖坑&#xff1a; 双指针&#xff1a; 小区间优化&#xff1a; 三数取中优化&#xff1a; 快排非递归实现&#xff1a; 快排的三路划…

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…

iOS 视频压缩 mov转mp4 码率

最近还是因为IM模块的功能&#xff0c;IOS录制MOV视频发送后&#xff0c;安卓端无法播放&#xff0c;迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS&#xff01; 使用AVAssetExportSessi…

使用sqlmap获取数据步骤

文章目录 1.使用sqlmap获取所有数据库2.使用sqlmap获取当前连接数据库3.使用sqlmap获取当前数据库下所有表名4.使用sqlmap获取当前数据库下某个表下所有列名5.使用sqlmap获取当前数据库下某个表下指定字段的数据6.测试当前用户是否是管理员7.使用burpsqlmap批量检测8.脱库命令9…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

二、机器学习基础知识:Python数据处理基础

文章目录 1、基本数据类型1.1 数字类型&#xff08;Number&#xff09;1.2 字符串类型&#xff08;String&#xff09;1.3 列表类型&#xff08;List&#xff09;1.4 元组类型&#xff08;Tuple&#xff09;1.5 字典类型&#xff08;Dictionary&#xff09;1.6 集合类型&#x…

掌动智能:替代JMeter的压力测试工具有哪些

JMeter是一个广泛使用的开源压力测试工具&#xff0c;但在实际应用中&#xff0c;也有一些其他优秀的替代品可供选择。本文将介绍几个可替代JMeter的压力测试工具&#xff0c;它们在功能、性能和易用性方面都具有独特优势&#xff0c;可以满足不同压力测试需求的选择。 一、Gat…