leetcode刷题——二叉树(1)

目录

1、递归遍历二叉树

2、迭代法遍历二叉树(通过while循环)

3、二叉树的层序遍历

4、二叉树的层次遍历 II

5、二叉树的右视图

6、二叉树的层平均值

7、N叉树的层序遍历

8、在每个树行中找最大值

9、填充每个节点的下一个右侧节点指针

10、填充每个节点的下一个右侧节点指针II

11、二叉树的最大深度

12、二叉树的最小深度


二叉树有两种主要的形式:满二叉树和完全二叉树、二叉搜索树、二叉平衡树

遍历方式

  • 深度优先遍历
    • 前序遍历(递归法,迭代法)中左右
    • 中序遍历(递归法,迭代法)左中右
    • 后序遍历(递归法,迭代法)左右中
    • 前中右代表中间节点的位置
  • 广度优先遍历
    • 层次遍历(迭代法)

1、递归遍历二叉树

  1. 确定递归函数的参数和返回值

  2. 确定终止条件

  3. 确定单层递归的逻辑

class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){};TreeNode(int val){this.val=val;}
}
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();preOrder(root,res);return res;}//前序遍历:中左右public void preOrder(TreeNode cur,List<Integer> res){if(cur==null){return;}res.add(cur.val);preOrder(cur.left,res);preOrder(cur.right,res);}//后序遍历:左右中public void postOrder(TreeNode cur,List<Integer> res){if(cur==null){return;}postOrder(cur.left,res);postOrder(cur.right,res); res.add(cur.val);}//中序遍历:左中右public void inOrder(TreeNode cur,List<Integer> res){if(cur==null){return;}inOrder(cur.left,res);res.add(cur.val);inOrder(cur.right,res); }
}

2、迭代法遍历二叉树(通过while循环)

class Solution {//前序迭代:先把中间节点入栈,然后弹出再把右边的节点入栈,再把左节点入栈,才能保证弹出的顺序是中左右public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<TreeNode> ss=new Stack();// stack方法 peek pop push empty 继承vectorif (root==null) return res;TreeNode cur=root;ss.push(cur);while(!ss.empty()){TreeNode node=ss.pop();res.add(node.val);if(node.right!=null) ss.push(node.right);if(node.left!=null) ss.push(node.left);}return res;}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<TreeNode> ss=new Stack<>();if(root==null) return res;TreeNode cur=root;//中序遍历,左中右 while(!ss.empty() || cur!=null){//不断的把左节点入栈if(cur!=null) {ss.push(cur);cur=cur.left;}//左节点为空,那就弹出当前的中间节点,然后把指针挪到右边节点else{cur=ss.pop();res.add(cur.val);cur=cur.right;}}return res;}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<TreeNode> ss=new Stack<>();if(root==null) return res;TreeNode cur=root;ss.push(cur);while(cur!=null || !ss.empty()){//左右中的顺序//先遍历完左边的节点,同时要切断树之间的联系,免得下次重复添加节点if(cur.left!=null){ss.push(cur.left);cur.left=null;cur=ss.peek();continue;}//遍历完右边的节点,同时要切断树之间的联系,免得下次重复添加节点if(cur.right!=null){ss.push(cur.right);cur.right=null;cur=ss.peek();}左右遍历结束后,就弹出中间节点,然后回到栈顶的下一个节点else{cur=ss.pop();res.add(cur.val);System.out.print(cur.val);if(!ss.empty()) cur=ss.peek();else{cur=null;}}}return res;}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();Stack<TreeNode> ss=new Stack<>();if(root==null) return res;TreeNode cur=root;ss.push(cur);//前序遍历是中左右,那改变左右顺序变成 中右左  最后反转就是左右中后序遍历while(!ss.empty()){cur=ss.pop();res.add(cur.val);if(cur.left!=null) ss.push(cur.left);if(cur.right!=null) ss.push(cur.right);}Collections.reverse(res);return res;
}

3、二叉树的层序遍历

class Solution {public  List<List<Integer>> res=new ArrayList<>();public List<List<Integer>> levelOrder(TreeNode root) {//queue方法 offer peek poll  linkedlist有sizeQueue<TreeNode> qq=new LinkedList<>();if(root==null) return res;qq.offer(root);while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();List<Integer> tem=new ArrayList<>();while(len>0){TreeNode node=qq.poll();tem.add(node.val);if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;}res.add(tem);}return res;}
}

4、二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {Queue<TreeNode> qq=new LinkedList<>();LinkedList<List<Integer>> res=new LinkedList<>();//queue的运行类型是链表,但是还是只能使用queue定义的方法 offer add peek poll remove 多态//LinkedList双链表实现 dequeue 和list 方法addFirst addLast getFirst removeFirstif(root==null) return res;qq.add(root);while(!qq.isEmpty()){List<Integer> tem=new LinkedList<>();int len=qq.size();while(len-->0){TreeNode node=qq.poll();tem.add(node.val);if(node.left!=null) qq.add(node.left);if(node.right!=null) qq.add(node.right);}res.addFirst(tem);}return res;}
}

5、二叉树的右视图

Given the root of a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

class Solution {public List<Integer> rightSideView(TreeNode root) {Queue<TreeNode> qq=new LinkedList<>();List<Integer> res=new LinkedList<>();if(root==null) return res;qq.offer(root);while(!qq.isEmpty()){int len=qq.size();TreeNode node=null;while(len-->0){node=qq.poll();if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);}//每一层都弹出,node保留的是最右边的值res.add(node.val);}return res;}
}

6、二叉树的层平均值

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组

class Solution {public List<Double> averageOfLevels(TreeNode root) {List<Double> res=new LinkedList<>();Queue<TreeNode> qq=new LinkedList<>();if(root==null) return res;qq.offer(root);while(!qq.isEmpty()){int len=qq.size();double sum=0;int i=len;while(i-->0){TreeNode node=qq.poll();sum+=node.val;if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);}//每一层都弹出,node保留的是最右边的值res.add(sum/len);}return res;}
}

7、N叉树的层序遍历

力扣题目链接(opens new window)

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<List<Integer>> levelOrder(Node root) {Queue<Node> qq=new LinkedList<>();List<List<Integer>> res=new LinkedList<>();if(root==null) return res;qq.offer(root);while(!qq.isEmpty()){int len=qq.size();Node node=null;List<Integer> tem=new LinkedList();while(len-->0){node=qq.poll();tem.add(node.val);if(node.children!=null){for(Node nn:node.children){qq.offer(nn);}}}//每一层都弹出,node保留的是最右边的值res.add(tem);}return res;}
}

8、在每个树行中找最大值

力扣题目链接(opens new window)

您需要在二叉树的每一行中找到最大的值。

Given the root of a binary tree, return an array of the largest value in each row of the tree (0-indexed).

class Solution {public List<Integer> largestValues(TreeNode root) {//queue方法 offer peek poll  linkedlist有sizeQueue<TreeNode> qq=new LinkedList<>();List<Integer> res=new ArrayList<>();if(root==null) return res;qq.offer(root);while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();int big=qq.peek().val;while(len>0){TreeNode node=qq.poll();big=big>node.val?big:node.val;if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;}res.add(big);}return res;}
}

9、填充每个节点的下一个右侧节点指针

力扣题目链接(opens new window)

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _left, Node _right, Node _next) {val = _val;left = _left;right = _right;next = _next;}
};
*/class Solution {public Node connect(Node root) {//queue方法 offer peek poll  linkedlist有sizeQueue<Node> qq=new LinkedList<>();if(root==null) return null;qq.offer(root);while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();while(len>0){Node node=qq.poll();if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;if(len!=0){node.next=qq.peek();}}}return root;}
}

10、填充每个节点的下一个右侧节点指针II

力扣题目链接(opens new window)

这道题的答案和上一个一样,上一个题目是满二叉树,这道题的是普通二叉树

class Solution {public Node connect(Node root) {//queue方法 offer peek poll  linkedlist有sizeQueue<Node> qq=new LinkedList<>();if(root==null) return null;qq.offer(root);while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();while(len>0){Node node=qq.poll();if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;if(len!=0){node.next=qq.peek();}}}return root;}
}

11、二叉树的最大深度

力扣题目链接(opens new window)

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

class Solution {public int maxDepth(TreeNode root) {//queue方法 offer peek poll  linkedlist有sizeQueue<TreeNode> qq=new LinkedList<>();    if(root==null) return 0;qq.offer(root);int depth=0;while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();         while(len>0){TreeNode node=qq.poll();if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;}depth++;}return depth;}
}

12、二叉树的最小深度

力扣题目链接(opens new window)

Given a binary tree, find its minimum depth.

The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node.

Note: A leaf is a node with no children.

class Solution {public int minDepth(TreeNode root) {//queue方法 offer peek poll  linkedlist有sizeQueue<TreeNode> qq=new LinkedList<>();    if(root==null) return 0;qq.offer(root);int depth=0;while(qq.size()!=0){//len代表每一层的节点数量int len=qq.size();         while(len>0){TreeNode node=qq.poll();if(node.left!=null) qq.offer(node.left);if(node.right!=null) qq.offer(node.right);len--;if(node.left==null&&node.right==null){return ++depth;}}depth++;}return depth;}
}

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

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

相关文章

Spring Boot 3 + Vue 3实战:实现用户登录功能

文章目录 一、实战概述二、实战步骤? &#xff08;一&#xff09;创建前端项目 - login-vue 1、创建Vue项目2、安装axios模块3、安装vue-router模块4、安装less和less-loader模块5、运行Vue项目6、在浏览器里访问首页7、在IDEA里打开Vue项目8、创建登录Vue组件9、创建首页Vue…

记录一次老平台改造通知用户刷新页面,纯前端实现

记录一次老平台改造通知用户刷新页面&#xff0c;纯前端实现 方案概述背景现状问题本质 方案设计前提设计实现 其他补充写在最后的话抛出一个问题 方案概述 背景 前端构建完上线&#xff0c;用户还停留还在老页面&#xff0c;用户不知道网页重新部署了&#xff0c;跳转页面的时…

11.12[CQU JAVEE_EXP3][JAVA WEB]3h速成JAVA WEB;DE启动Tomcat的各种BUG;GIT

GIT 如果有四个实验&#xff0c;但希望将四个实验保存在一个远程仓库当中&#xff0c;且分别有一个文件夹来区分&#xff0c;但是在本地写实验的时候&#xff0c;希望每次只打开一个实验&#xff0c;并且做完后向远程仓库中提交&#xff0c;不会拉取远程仓库中的其它实验代码 …

PYTHON编写API

API——application programming interface 全称为应用程序开发接口&#xff0c;是不同软件系统之间相互通信的桥梁。通过API&#xff0c;开发者可以通过标准化的请求和响应机制&#xff0c;访问服务器上的数据和功能&#xff0c;而无需了解具体的内部实现细节。在python中&am…

网络基础和UDP函数的简单使用

网络发展 最开始&#xff0c;计算机是独立的个体&#xff0c;因为需求需要计算机之间交换数据&#xff0c;由局域网&#xff08;私网&#xff09;–>广域网&#xff08;公网&#xff09;&#xff0c;网络就逐渐发展起来了。 初识协议 协议就是一种约定 网络协议就是众多协…

Netty入门教程——认识Netty

Netty入门教程——认识Netty 什么是Netty&#xff1f; Netty 是一个利用 Java 的高级网络的能力&#xff0c;隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架&#xff08;Netty 在 2011 年获得了Duke’s Choice …

调用大模型api 批量处理图像 保存到excel

最近需要调用大模型&#xff0c;并将结果保存到excel中&#xff0c;效果如下&#xff1a; 代码&#xff1a; import base64 from zhipuai import ZhipuAI import os import pandas as pd from openpyxl import Workbook from openpyxl.drawing.image import Image from io i…

Python基于TensorFlow实现BP和LSTM神经网络的空气质量预测并使用SHAP解释模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着工业化进程的加速和城市化的扩展&#xff0c;空气污染成为全球面临的主要环境问题之一。空气质…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…

对于小型企业,独立站和电商平台哪个更经济?

对于小型企业来说&#xff0c;选择独立站还是电商平台&#xff0c;需要根据各自的成本优势来决定。以下是一些关键点的比较&#xff1a; 平台费用&#xff1a; 电商平台&#xff1a;通常需要缴纳一定比例的交易佣金或年费&#xff0c;例如天猫、京东等平台的保证金和佣金费用相…

带权并查集和扩展域并查集的一些整理和理解(上)

请读者在有一定并查集基础上再阅读&#xff08;至少要知道什么是带权和扩展域并查集&#xff09; 在最近做题时候&#xff0c;我遇到了一些带权并查集和扩展域并查集的题目。我觉得它们都很难写也很难想&#xff0c;尤其是带权并查集我几乎第一时间无法想到是怎么做的&#xf…

json+Tomact项目报错怎么办?

在响应请求的时候&#xff0c;如果http响应没有指定响应数据的content-type&#xff0c;浏览器就不知道按照什么格式解析响应体的数据&#xff0c;因为浏览器只知道怎样解析http的行和头&#xff0c;再从头里获取响应体的字节长度和类型&#xff0c;按照你给的长度去截流&#…

极限激光雷达点云数据集

https://arxiv.org/pdf/2307.07607v5 ‎ - AirLab 他们的数据集里面有这么多极限场景 点云数据转换 他们的激光用的velodyne,录制的格式是【velodyne_msgs/VelodyneScan】 需要把【velodyne_msgs/VelodyneScan】转化成【sensor_msgs/PointCloud2】 我编译https://github.co…

信奥常考点:二叉树的构建(已知中序和 前序或后序 的情况下)

一、题目引入 这是来自CCF-GESP C七级认证 2024年9月的题目。 我们在此不解题&#xff0c;只把树画出来。 CCF-GESP 编程能力认证 C 七级 2024年9月份详细解析-CSDN博客 二、解题过程 我们可以根据先序遍历得出根节点是A&#xff0c;然后我们得到了A的左子树[B D]&#xff08;橙…

电容的概念和基本参数

电容基本概念 电容最简单的结构可由两个相互靠近的导体平面中间夹一层绝缘介质组成&#xff0c;当在电容两个极板间加上电压时&#xff0c;电容就会储存电荷&#xff0c;所以电容是一个充放电荷的电子元器件。电容量是电容储存电荷多少的一个量值&#xff0c;平板电容的电容量…

【js逆向专题】13.jsvmp补环境篇一

目录 一.了解jsvmp技术1. js虚拟机保护方案2.jsvmp实现原理3. 模拟jsvmp执行过程 二.环境检测1. 什么是环境检测2.案例讲解 三. 项目实战1. 案例11.逆向目标2. 项目分析1.补第一个referrer2. 调试技巧13. 调试技巧24. 补充sign5. 补 length6. 参数长短补充 3. 逆向结果 2. 案例…

高质量翻译在美国推广移动应用中的重要性

美国的移动应用市场是世界上竞争最激烈、利润最高的市场之一&#xff0c;为开发者提供了接触数百万潜在用户的机会。然而&#xff0c;进入这个市场需要的不仅仅是创新技术或令人信服的想法&#xff1b;它要求与目标受众进行有效地沟通和文化契合。在这个过程中&#xff0c;高质…

[Redis#17] 主从复制 | 拓扑结构 | 复制原理 | 数据同步 | psync

目录 主从模式 主从复制作用 建立主从复制 主节点信息 从节点信息 断开主从复制关系 主从拓扑结构 主从复制原理 1. 复制过程 2. 数据同步&#xff08;PSYNC&#xff09; 3. 三种复制方式 一、全量复制 二、部分复制 三、实时复制 四、主从复制模式存在的问题 在…

【Unity高级】如何动态调整物体透明度

本文介绍了如何设置及动态调整物体的透明度。 一、手动设置的方法 我们先来看下如何手动设置物体的透明度。 物体的透明与否是通过材质来设置的。只有我们把具有透明度的材质指给物体的渲染器&#xff08;Render&#xff09;&#xff0c;物体就被设置成相应的透明度了。 看一…

相机动态/在线标定

图1 图2 基本原理 【原理1】平行线在射影变换后会交于一点。如图所示,A为相机光心,蓝色矩形框为归一化平面,O为平面中心。地面四条黄色直线为平行且等距的车道线。HI交其中两条车道线于H、I, 过G作HI的平行线GM交车道线于M。HI、GM在归一化平面上的投影分别为JK、PN,二者会…