文章目录

  • 理论基础
  • 二叉树的递归遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 总结
  • 二叉树的层序遍历
    • 基础层序遍历
    • 二叉树的右视图

理论基础

二叉树在结构上的两个常用类型:

  • 满二叉树
  • 完全二叉树

在功能应用上的比较常用的有:

  • 二叉搜索树: 节点有权值、遵循”左小右大“
  • 平衡二叉搜索树(AVL树): 在二叉树的基础上增添了一个特性,左右子树高度差不超过1

二叉树的存储方式

  • 顺序存储:使用数组,在内存中连续分布在这里插入图片描述

  • 链式存储:使用指针,在内存中离散分布在这里插入图片描述

二叉树的遍历方式

  • 深度优先遍历(可借助栈)
    • 前序遍历(递归法,迭代法)
    • 中序遍历(递归法,迭代法)
    • 后序遍历(递归法,迭代法)
  • 广度优先遍历(可借助队列)
    • 层序遍历(迭代法)

二叉树的定义

public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}

二叉树的递归遍历

前序遍历

题目链接:144. 二叉树的前序遍历

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preRead(root,result);return result;}public void preRead(TreeNode node,List<Integer> list){if(node == null) return;list.add(node.val);preRead(node.left,list);preRead(node.right,list);}
}

中序遍历

题目链接:94. 二叉树的中序遍历

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();inRead(root,result);return result;}public void inRead(TreeNode node,List<Integer> list){if(node == null) return;inRead(node.left,list);list.add(node.val);inRead(node.right,list);}
}

后序遍历

题目链接:145. 二叉树的后序遍历

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();postRead(root,result);return result;}public void postRead(TreeNode node,List<Integer> list){if(node == null) return;postRead(node.left,list);postRead(node.right,list);list.add(node.val);}
}

总结

递归算法的三要素

  • 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

    • 通过”参数传递“自顶向下传递信息
    • 通过”函数返回值“自底向上传递信息
    • 使用全局变量,在各级函数间共享信息
  • 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  • 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

二叉树的层序遍历

基础层序遍历

题目链接:102. 二叉树的层序遍历

层序遍历的逻辑:

  • 初始化一个队列
  • 首先将根节点放入队列中
  • 接下来循环往复如下操作
    • 弹出队头元素
    • 将弹出元素的左右节点入队

这个题的要求在层序遍历的基础上增加了分层的逻辑,解题逻辑如下:

  • 在层序遍历的基础上
  • 我们再初始化一个队列temp(主队列命名为queue)
  • 我们在queue中把当前层的元素弹出时,并不立马将其左右元素入队queue,而是将其添加到temp队列中
  • 当queue中所有元素弹完之后,再将temp的元素全部添加到queue中
  • 这样就达成了queue中永远是二叉树中每层的所有元素

解题逻辑:

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new ArrayList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<List<Integer>>();queue.add(root);while(!queue.isEmpty()) {List<Integer> part = new ArrayList<>();Deque<TreeNode> temp = new ArrayDeque<>();while (!queue.isEmpty()) {TreeNode node = queue.poll();part.add(node.val);if(node.left != null) temp.add(node.left);if(node.right != null) temp.add(node.right);}result.add(part);while(!temp.isEmpty()) queue.add(temp.poll());}return result;}
}

这个地方可以进一步改进:

  • 无需使用新的队列来临时存储一层的元素
  • 而是可以直接用一个变量界定一层的元素个数
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> result = new LinkedList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<List<Integer>>();queue.add(root);while(!queue.isEmpty()) {List<Integer> part = new LinkedList<>();int count = queue.size();while (count > 0) {TreeNode node = queue.poll();part.add(node.val);if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);count--;}result.add(part);}return result;}
}

二叉树的右视图

题目链接:199. 二叉树的右视图

解题逻辑:

  • 在前一题的基础上只将每一层的最后一个元素添加到结果集中就可以
  • 我们通过控制每层的长度变量,当变量为1的时候才添加到结果集中
class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> result = new LinkedList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return new ArrayList<Integer>();queue.add(root);while(!queue.isEmpty()) {int count = queue.size();while (count > 0) {TreeNode node = queue.poll();if(count == 1) result.add(node.val);if(node.left != null) queue.add(node.left);if(node.right != null) queue.add(node.right);count--;}}return result;}
}

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

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

相关文章

Flutter 之 table_calendar 控件

1.库导入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代码编写TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 数组异或操作

数组异或操作题目题解题目 1486. 数组异或操作 给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的…

php7.4使用 new DateTime;报错 Class DateTime not found

php7.4使用 new DateTime;报错Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天资料&#xff0c;最后找到了解决办法 DateTime 是 php 内置的类&#xff0c;不隶属于任何命名空间&#xff0c;如果你需要在命名空间中使用须有 \ 声明&#xff0c;解决办法就是…

Gartner《构建可扩展数据产品建设框架》心得

一、背景与价值 1.1 “数据产品”为什么忽然重要? 传统模式:业务提出需求 → IT 建数据集 → ETL 管道爆炸 → 维护成本指数级上升。 新范式:把“数据”包装成“产品”,以产品思维迭代演进,强调复用、自助、可扩展。 Gartner 观察到:大量组织把“报表”或“数据仓库”重…

CentOS/RHEL LVM 磁盘扩展完整教程

CentOS/RHEL LVM 磁盘扩展完整教程&#x1f4dd; 前言 在Linux系统管理中&#xff0c;磁盘空间不足是经常遇到的问题。特别是在生产环境中&#xff0c;当根分区空间告急时&#xff0c;我们需要通过添加新磁盘来扩展存储空间。本教程将详细介绍如何在CentOS/RHEL系统中使用LVM&a…

LVGL应用和部署(用lua做测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】嵌入式产品做好了&#xff0c;下面就是测试和量产了。以按键屏幕的开发模式为例&#xff0c;如果仅仅是简单的功能测试&#xff0c;那还比较好解决&…

phpstudy搭建pikachu

一.启动mysql和nginx服务二.修改靶场文件参数点击管理打开根目录&#xff0c;将下载好的靶场源文件解压到www目录下三.找到此文件用记事本打开四.修改配置文件五.打开浏览器,输入127.0.0.1/pikachu六.按照步骤初始化心得体会&#xff1a;如果mysql启动又立刻停止&#xff0c;大…

【Linux】GDB/CGDB 调试器学习笔记

GDB/CGDB 调试器学习笔记&#x1f680; 前言 GDB 是 GNU 项目下功能强大的命令行调试器&#xff0c;适用于 C/C 等多种语言。CGDB 则是在 GDB 之上构建的轻量级 curses 界面&#xff0c;适合喜欢终端操作且习惯 vi 风格的人。一、GDB 入门篇 1. 编译时带调试信息 gcc -g -O0 -W…

链接代理后无法访问网络

路由方向的问题 cmd 输入 route print 查看路由多了一个不是你网络的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 参考这个 固定ip if是代理链路的 链路口又敏感词这个文章不合规两次评论区问我

day37 早停策略和模型权重的保存

DAY 37 我今天的笔记是用cpu训练的&#xff0c;请自行修改为gpu训练 仍然是循序渐进&#xff0c;先复习之前的代码 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

网络爬虫分类全解析

网络爬虫作为数据获取的重要工具,其分类方式多样,不同类型的爬虫在技术实现、应用场景和功能特性上存在显著差异。深入理解这些分类,有助于开发者根据实际需求选择合适的爬虫方案。本文将从技术特性、应用场景和架构设计三个维度,系统介绍网络爬虫的主要分类。 一、按技术…

ECR仓库CloudFormation模板完整指南

概述 本文档详细介绍了一个通用的Amazon ECR(Elastic Container Registry)仓库CloudFormation模板,该模板支持多业务组、参数化配置,并包含完整的安全策略、生命周期管理和监控功能。 模板特性 核心功能 ✅ 支持4个业务组:app、ai、mall、frontend✅ 灵活的服务名手动输…

C++(STL源码刨析/List)

一 List 核心字段和接口1. 节点字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 链表 不是连续的内存块&#xff0c;所以对每一个申请到的内存块要进行统一组织&#xff0c;也就是封装成一个类…

苹果App上架流程:不用Mac也可以上架的方法

iOS App 的上架流程一直被认为是门槛最高、流程最繁琐的移动端工作之一。对很多使用 Windows 或 Linux 进行开发的跨平台团队来说&#xff0c;Mac 的缺位更放大了每一步的难度。 在我们近期为一款本地生活类 App 进行 iOS 上架时&#xff0c;团队成员几乎没有配备本地 Mac&…

【爬虫】- 爬虫原理及其入门

爬虫01 - 爬虫原理及其入门 文章目录爬虫01 - 爬虫原理及其入门一&#xff1a;爬虫原理1&#xff1a;爬虫的优势‌2&#xff1a;爬虫的核心库3&#xff1a;经典举例4&#xff1a;合规问题一&#xff1a;爬虫原理 学习爬虫之前前置知识需要了解这些&#xff1a; 我的HTTP介绍, 了…

G5打卡——Pix2Pix算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 Pix2Pix 是一种基于条件生成对抗网络&#xff08;cGANs&#xff09;的图像到图像翻译算法&#xff0c;由 Phillip Isola 等人在 2016 年提出。该算法的核心思想…

动力系统模拟与推导-AI云计算数值分析和代码验证

当系统是连续的&#xff0c;并且其状态变量不仅随时间变化&#xff0c;而且随空间维度变化时&#xff0c;需要使用偏微分方程&#xff08;PDEs&#xff09;来推导运动方程。偏微分方程提供了描述这些空间分布属性如何相互作用和演化的数学框架。 选择使用常微分方程&#xff08…

P4597 序列 sequence题解

P4597 序列 sequence 给定一个数列&#xff0c;每次操作可以使任意一个数1或-1&#xff0c;求小的操作次数&#xff0c;使得数列变成不降数列. 1.对于前面比当前位的数字大的数&#xff0c;设最大数为 xxx &#xff0c;当前的数为 yyy ,则对于 xxx 到 yyy 中间的任意数&#xf…

雨污管网智慧监测系统网络建设方案:基于SD-WAN混合架构的最佳实践

随着城市化的快速推进&#xff0c;雨污管网的管理与运行面临着日益复杂的挑战&#xff0c;例如内涝、污水溢流、非法排污等问题频发。为了更高效地管理分布广泛的监测点&#xff0c;保障系统运行稳定性&#xff0c;构建一套高效、低成本、易运维的网络架构至关重要。本文将分享…

世俱杯直播数据源通过反汇编获取到

在当今的互联网体育赛事直播中&#xff0c;许多平台为了保护其直播资源&#xff0c;会采用加密、混淆或动态加载等方式隐藏真实的视频流地址&#xff08;如 .m3u8 或 .flv&#xff09;。对于普通用户和开发者来说&#xff0c;直接通过网页源码或浏览器调试器难以快速定位这些关…