LeetCode刷题笔记9.9-9.15

news/2024/11/14 14:24:32/文章来源:https://www.cnblogs.com/Wyuf1314/p/18404610

LeetCode刷题笔记9.9-9.15

二叉树

主要学两种遍历方式:层序遍历、递归遍历

1)层序遍历BFS

基本思想:逐层遍历元素,可以借助队列,先进先出,队首出元素的同时进该元素的左右节点(这也是最简单的实现方式)

队列Q:1 -> 出1 进2,3(2,3)-> 出2 进4(3,4)-> 出3 进5,6(4,5,6)-> 出4(5,6)-> 出5(6)-> 出6(空)
队列进出元素的操作在遇到队列为空时停止

void levelOrderTraverse(TreeNode root) {if (root == null) {return;}Queue<TreeNode> q = new LinkedList<>();q.offer(root);while (!q.isEmpty()) {TreeNode cur = q.poll();// 访问 cur 节点System.out.println(cur.val);// 把 cur 的左右子节点加入队列if (cur.left != null) {q.offer(cur.left);}if (cur.right != null) {q.offer(cur.right);}}
}

进阶思想:在层次遍历过程中记录树的深度
记录深度的时机:

队列Q:1 -> 出1 进2,3(2,3)-> 出2 进4(3,4)-> 出3 进5,6(4,5,6)-> 出4(5,6)-> 出5(6)-> 出6(空)

当前层的所有节点的孩子节点全部列入队列时,此时一定是当前层的最后一个节点刚出队列,比如以上变换过程中的出3后,当前第2层(从1层算起)遍历结束,第3层开始遍历
修改基础的遍历代码:

void levelOrderTraverse(TreeNode root) {if (root == null) {return;}int depth = 0;Queue<TreeNode> q = new LinkedList<>();q.offer(root);while (!q.isEmpty()) {int depthSize = q.size();for(int i = 0; i < depthSize; i++){TreeNode cur = q.poll();// 访问 cur 节点System.out.println(cur.val);// 把 cur 的左右子节点加入队列if (cur.left != null) {q.offer(cur.left);}if (cur.right != null) {q.offer(cur.right);}}depth++;}
}

【二叉树的层序遍历可以用到求与二叉树最短深度/到叶子节点的最短路径相关的题目中,深度遍历必须要遍历完所有树枝的深度,作比较后才可得到】

2)递归遍历DFS

理解递归遍历与迭代循环遍历的区别和联系

// 迭代遍历数组
void traverse(int[] arr) {for (int i = 0; i < arr.length; i++) {}
}// 递归遍历数组
void traverse(int[] arr, int i) {if (i == arr.length) {return;}// 前序遍历要做的操作// 这里是每层递归刚进来的位置 适用于正序遍历traverse(arr, i + 1);// 后序遍历要做的操作// 这里是每层递归快要结束的位置 适用于反序遍历
}// 迭代遍历单链表
void traverse(ListNode head) {for (ListNode p = head; p != null; p = p.next) {}
}// 递归遍历单链表
void traverse(ListNode head) {if (head == null) {return;}// 前序位置traverse(head.next);// 后序位置
}

再来看二叉树/多叉树的递归遍历

void traverse(TreeNode root){if(root == null) return;// 这里是每层递归刚刚进入的位置,是前序的操作traverse(root.lchild);// 这里是递归左子树结束的位置,是中序的操作traverse(root.rchild);    // 这里是每层递归将要结束的位置,是后序的操作
}
class Node{int val;List<Node> children;
}
void traverse(Node root) {if (root == null) {return;}// 前序位置for (Node child : root.children) {// 依次遍历所有孩子节点来递归traverse(child);}// 后序位置
}

由此推导出二叉树的遍历实现规律:
前中后序是遍历二叉树过程中处理每一个节点的三个特殊时间点
不仅仅是三个顺序不同的 List:
前序位置的代码在刚刚进入当前二叉树节点的时候执行;
后序位置的代码在将要离开一个二叉树节点的时候执行;
中序位置的代码在一个二叉树节点左子树都遍历完,即将开始遍历右子树的时候执行。

二叉树的所有问题,就是让你在前中后序位置注入巧妙的代码逻辑,去达到自己的目的,你只需要单独思考每一个节点应该做什么,其他的不用你管,抛给二叉树遍历框架,递归会在所有节点上做相同的操作。

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

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

相关文章

PMP考试通过率提升,项目管理软件的作用不可小觑!

PMP(Project Management Professional)考试的通过率提升,不仅仅依赖于考生的个人努力和知识积累,项目管理软件的有效运用也起到了重要的辅助作用。 在现代项目管理的环境中,尤其是PMP考试的备考过程中,项目管理软件的使用能够帮助考生更好地理解和应用项目管理的概念和工…

Idea2024-java-Maven开发配置

断断续续用过Idea做一些java的学习,在此记录一下最后的配置过程。 安装idea,社区版 https://www.jetbrains.com.cn/idea/download/?section=windows 安装后,setting检查maven的配置 如果想换Mavan的版本,可以自己下载到本地后,点击“Mavan home path”后面的"...&qu…

IPD项目管理流程如何优化?这些软件帮你搞定!

IPD(Integrated Product Development,集成产品开发)项目管理流程强调跨部门协作、产品生命周期管理和高效的信息流通。在这样的项目管理模式下,不仅要协调产品设计、研发、制造等部门的工作,还要确保在产品生命周期的各个阶段,信息和资源能够高效、无缝地流动。 要优化IP…

c# 变量引发了类型“System.NullReferenceException”的异常【未解】

2024/11/14 求助,为什么“targetRoundId1”引发了类型“System.NullReferenceException”的异常代码: Dictionary<string, Dictionary<string,string>> exchangeRateDict1 = new (); exchangeRateDict1.Add("USD", new Dictionary<string, string&g…

Package libgconf-2-4 is not installed

背景 ubuntu下载官网的向日葵客户端,按照官方的不走安装,报错如下分析 用apt-get也下载不下来,官方faq没能找到有用的处理方法,只能自行找到安装包自己安装 依赖包离线下载 sudo wget http://th.archive.ubuntu.com/ubuntu/pool/universe/g/gconf/libgconf-2-4_3.2.6-7ubun…

python--slice切片规则

l1=(1,2,3,4,5,6,7,8,9) s1=slice(1,5,2) print(l1[s1])

[KB]Windows 11自动黑屏,疑似自动进入休眠状态

问题现象: Windows 11在电源现象中设置了,永不睡眠(Sleep); 永不关闭Disk等电源设置项目后,依旧会自动进入疑似休眠的状态。 可以尝试以下方法: # 查看当前设定 PS C:\Users\Administrator> powercfg -a The following sleep states are available on this system:Stan…

权限系统:权限应用服务设计Tu

大家好,我是汤师爷~ 今天聊聊权限系统的应用服务设计。从业务需求的角度来看,权限系统需要解决两个核心问题: 1、菜单渲染与动态展示 当用户成功登录并接入系统后,系统需要动态获取并展示该用户有权限访问的菜单项。 这一过程涉及前端系统与权限系统的交互。前端系统会向权…

.NET 8 强大功能 IHostedService 与 BackgroundService 实战

前言 在.NET 8中,IHostedService 和 BackgroundService 两个核心接口的引入,增强了项目开发中处理定时任务的能力。这两个接口不仅简化了定时任务、后台处理作业以及定期维护任务的实现过程,还提升了在ASP.NET Core 或任何基于.NET的宿主应用程序中的集成与管理效率。 IHost…

往事随风:SAP查看程序代码方式

1、点“系统"--状态 2、在状态窗口中,”程序”文本框中为该事务码的程序,双击可以打开源代码;, 4*&---------------------------------------------------------------------* *& Report ZFIRP0037 *&--------------------------------------------------…

2024年最佳项目管理软件排行,大厂都在用的13个工具!

随着企业对项目管理的需求日益增长,项目管理软件市场也在迅速发展。2024年,市场上出现了许多优秀的项目管理工具,这些工具不仅功能强大,而且用户体验优秀,能够满足不同规模和需求的团队。以下是经过精心挑选的13款项目管理软件,特别适合大厂使用,其中包含了国产开源项目…

Grafana:监控PostgreSQL数据运维新利器

在数据驱动的业务环境中,数据库的性能监控是确保数据流畅和系统稳定的关键。PostgreSQL,作为强大的开源关系型数据库,其性能监控尤为重要。Grafana,一个开源的数据可视化和监控平台,提供了一个直观的界面来监控和分析数据。本文将带您了解如何利用Grafana来监控PostgreSQL…