左神算法基础巩固--3

文章目录

  • 二叉树
    • 二叉树的遍历
      • 先序遍历
      • 中序遍历
      • 后序遍历
    • 解答
      • 二叉树的宽度优先遍历
    • 在这里插入图片描述 一颗完全二叉树具有以下特征:1.不存在任何一个节点具有右子树但不存在左子树.2.不存在任何一个节点在满足1的情况下左右子树不全且其后续节点不为叶子节点 根据以上特征我们便可以解决上述问题代码如下: leaf就是是否遇到了左右子树不双全的情况。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/52cc9f58cf304c6eb4f87e43a4e24f2f.png)
    • 在这里插入图片描述


二叉树

二叉树的遍历

二叉树的遍历依靠的是递归序,即每一个节点一共可以回到自己三次,也因此根据这个可以得到二叉树的先序遍历,中序遍历,后序遍历

先序遍历

先序遍历(Preorder Traversal)是二叉树遍历的一种方式,其遍历顺序为:
1.访问根节点。
2.先序遍历左子树。
3.先序遍历右子树。
在先序遍历中,根节点是第一个被访问的节点。这种遍历方式常用于创建树的副本或复制树的结构,因为它首先访问根节点,然后再依次访问子节点。
其按递归序来理解便是当第一次来到当前节点时便打印

递归实现先序遍历代码:

import java.util.ArrayList;
import java.util.List;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class PreorderTraversal {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();preorderHelper(root, result);return result;}private void preorderHelper(TreeNode node, List<Integer> result) {if (node == null) {return;}// 1第一次来到这个函数result.add(node.val);preorderHelper(node.left, result);// 2 第2次来到preorderHelper(node.right, result);//3 第3次来到}
}

非递归实现先序遍历,非递归实现先序遍历的话可以使用栈来实现,我们需要先吧头节点加入栈中再将右子节点压入栈中和左子节点压入栈中,java代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class PreorderTraversal {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null) {return result;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();result.add(node.val); // 访问当前节点// 先压入右子节点,再压入左子节点,以保证左子节点先被访问if (node.right != null) {stack.push(node.right);}if (node.left != null) {stack.push(node.left);}}return result;}
}

中序遍历

中序遍历(Inorder Traversal)是二叉树遍历的一种方式,其遍历顺序为:
中序遍历左子树.
访问根节点.
中序遍历右子树.
在中序遍历中,对于二叉搜索树(BST),遍历的结果会按照节点值的升序排列.这种遍历方式常用于获取二叉搜索树的有序序列.
其按递归序来理解便是当第二次来到当前节点时便打印

递归实现中序遍历代码:

import java.util.ArrayList;
import java.util.List;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class InorderTraversal {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();inorderHelper(root, result);return result;}private void inorderHelper(TreeNode node, List<Integer> result) {if (node == null) {return;}inorderHelper(node.left, result);result.add(node.val);inorderHelper(node.right, result);}
}

非递归实现中序遍历,我们一直向左遍历将遍历到的节点压入栈中直到左子树为空,再弹出栈顶,并开始右子树的遍历,java代码:在这里插入图片描述

后序遍历

后序遍历(Postorder Traversal)是二叉树遍历的一种方式,其遍历顺序为:
后序遍历左子树.
后序遍历右子树.
访问根节点.
在后序遍历中,根节点是最后一个被访问的节点.这种遍历方式常用于删除树的节点或计算树的某些属性时,因为先处理子节点可以确保在处理根节点时,子节点已经被处理完毕
其按递归序来理解便是当第三次来到当前节点时便打印

递归实现后序遍历代码:

import java.util.ArrayList;
import java.util.List;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class PostorderTraversal {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();postorderHelper(root, result);return result;}private void postorderHelper(TreeNode node, List<Integer> result) {if (node == null) {return;}postorderHelper(node.left, result);postorderHelper(node.right, result);result.add(node.val);}
}

非递归实现后序遍历,我们先创建处两个栈,在第一个栈中我们先压入头节点,之后循环将第一个栈中的当前节点压入到第二个栈中,同时先压入当前节点的左节点,再压入当前节点的右节点,之后再遍历输出第二个栈中的内容便是后序遍历,java代码:
在这里插入图片描述

解答

在这里插入图片描述

二叉树的宽度优先遍历

在二叉树的宽度优先遍历中我们采用队列的方式实现,我们先将头节点加入队列,并将队列中的节点弹出,同时将弹出节点的左右节点压入队列,后不断循环直到队列为空。
在这里插入图片描述
将上述代码进行修改便能得到上述问题的解,我们只需要加入一个当前的层数的变量和一个当前的层数有多少节点的变量便能够解决
在这里插入图片描述
我们先创建一个HashMap用来存储每个节点在哪一层,同时在进行宽度优先遍历的时候,每遍历到一个节点就判断他与当前的层数是否相等相等便更新当前的层数的节点数,如果不相等便将树的最大节点数与当前层数的节点数相比较如果大于树的层的最大节点数便更新树的层的最大节点数。
在这里插入图片描述
面对这种题我们可以使用中序遍历解决,我们直接中序遍历这棵树,并将其所有节点都加入到一个数组中,遍历这个数组判断其是否为升序数组,如果是返回true,如果不是返回false
我们也可以使用另一种方式解答这道题: 我们首先需要明确的是判断一棵树是否为二叉搜索树是由其左子树和右子树以及当前节点决定的,当一棵树的左子树不为二叉搜索树或其右子树不为二叉搜索树或当前节点小于或等于其前一个节点,均能认为这棵树不为二叉搜索树。因此我们可以用递归的方法解决这个问题,我们先用递归的方法判断其左子树是否为二叉搜索树,如果不是便直接返回该树不是二叉搜索树,如果是再进行判断当前当前节点死否小于或等于其前一个节点,如果是便返回该数不是二叉搜索树,如果不是便更新前一个节点的值,再对右子树进行判断。
在这里插入图片描述


在这里插入图片描述
一颗完全二叉树具有以下特征:1.不存在任何一个节点具有右子树但不存在左子树.2.不存在任何一个节点在满足1的情况下左右子树不全且其后续节点不为叶子节点
根据以上特征我们便可以解决上述问题代码如下:
leaf就是是否遇到了左右子树不双全的情况。
在这里插入图片描述

在这里插入图片描述
判断一棵树是否为满二叉树可以运用二叉树树形dp问题的套路解决,即向他的左右子树要信息,以此题为例,判断一个二叉树是否为满二叉树,我们需要知道这棵树的高度和这棵树的节点个数,即我们需要向每个节点的父节点返回以自己为头节点的子树有多少个节点,以及以自己为头节点的子树的高度是什么,这些信息可以封装起来方便返回。

故这道题的解题思路为,我们先得到当前节点的左子树的信息和右子树的信息,然后,我们根据这些信息得到我们需要返回的以当前节点为头节点的子树的高度,之后我们再根据左右子树的信息得到以当前节点为头节点的子树的节点树,最后拼接成自己需要返回的信息返回。

这道题的解题代码为:
在这里插入图片描述


在这里插入图片描述
判断一棵树是否是平衡二叉树可以运用二叉树树形dp问题的套路解决,即向他的左右子树要信息,以此题为例,判断一棵二叉树是否是平衡二叉树,我们需要知道其左子树的是否为平衡二叉树,其右子树是否为平衡二叉树,以及其左子树的高度和其右子树的高度。即我们需要向每个节点的父节点返回以自己为头节点的子树是否平衡,以自己为头节点的子树的深度,这些信息可以封装起来方便返回。

故这道题的解题思路为,我们先得到当前节点的左子树的信息和右子树的信息,然后,我们根据这些信息得到我们需要返回的以当前节点为头节点的子树的高度,之后我们再根据左右子树的信息得到当前节点是否平衡(根据左子树是否平衡,右子树是否平衡,左右子树的高度差是否小于2),最后拼接成自己需要返回的信息返回。

这道题的解题代码为:
在这里插入图片描述


在这里插入图片描述
这道题与上面的几道题虽然都需要运用递归的方法进行求解但却有些不同,在求解该题时,我们需要先需要找到每个节点的父节点,并存储起来,之后再找到node1的父节点和各个祖先节点并存储。之后再让node2在node1的父节点和各个祖先节点找到相同的最低公共祖先节点

这道题的解题代码如下:
在这里插入图片描述
在这里插入图片描述
我们也可以采用更为简单的方法,即从头查找,寻找以当前节点为头的子树是否存在node1或node2如果是则说明当前节点是node1或node2的祖宗节点
在这里插入图片描述


在这里插入图片描述

在解这道题中,我们可以直接中序遍历这棵树并将其存储到一个数组中,之后遍历这个数组得到node节点的后继节点
当然我们也可以使用另一种更加省时省力的方法解决
解题思路:当node节点有右子树的时候,其后继节点即为其右子树的最左节点,当node节点没有右子树的时候node节点的后继节点为以x为左树的父节点

在这里插入图片描述


在这里插入图片描述
我们可以用_表示节点的值到此为止,用#表示null,则先序序列化便显而易见了,我们只需要在先序遍历的基础了添加上述约定的字符
在这里插入图片描述

在这里插入图片描述
反序列化则是依据先序遍历和上述约定画出一棵树
在这里插入图片描述


在这里插入图片描述
解该问题时我们需要总结出一个规律那就是每次折叠都是在原来的基础上往上添加down往下添加up 有这个规律后,我们直接遍历生成便能解决问题
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

推动多语言语音科技迈向新高度:INTERSPEECH 2025 ML-SUPERB 2.0 挑战赛

随着语音技术在各领域应用的迅速扩展&#xff0c;全球语言与口音的多样性成为技术进一步突破的重大挑战。为了应对这一难题&#xff0c;来自卡内基梅隆大学&#xff08;CMU&#xff09;、斯坦福大学&#xff08;Stanford University&#xff09;、乔治梅森大学(George Mason Un…

IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

日前&#xff0c;IvorySQL 4.0 重磅发布&#xff0c;全面支持 PostgreSQL 17&#xff0c;并且增强了对 Oracle 的兼容性。关于 IvorySQL 4.0 的介绍&#xff0c;各位小伙伴可以通过这篇文章回顾&#xff1a;IvorySQL 4.0 发布&#xff1a;全面支持 PostgreSQL 17. 在 IvorySQL…

flink的EventTime和Watermark

时间机制 Flink中的时间机制主要用在判断是否触发时间窗口window的计算。 在Flink中有三种时间概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在数据抵达算子产生的时间&#xff08;Flink默认使用ProcessTime&#xff09; IngestionT…

Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci

1.关闭MySQL8的服务CTRLshiftESC&#xff0c;找到MySQL关闭服务即可 2.找到配置文件路径&#xff08;msi版本默认&#xff09; C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…

python学习笔记—14—函数

1. 函数 (1) len与my_len str "supercarrydoinb"def my_len(tmp_str):cnt 0for i in tmp_str:cnt 1return cntstr_len_1 len(str) str_len_2 my_len(str) print(f"len {str_len_1}") print(f"my_len {str_len_2}") (2) 函数传参数量不受…

Flink源码解析之:Flink on k8s 客户端提交任务源码分析

Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时&#xff0c;需要如何做呢&#xff1f;要引入什么第三方依赖&#xff1f;需要提供什么内容&#xff1f;flink是如何将job提交到k8s上的&#xff1f;经过了什么样的流程&#xff0c;内部有…

React Native 项目 Error: EMFILE: too many open files, watch

硬件&#xff1a;MacBook Pro (Retina, 13-inch, Mid 2014) OS版本&#xff1a;MacOS BigSur 11.7.10 (20G1427) 更新: 删除modules的方法会有反弹&#xff0c;最后还是手动安装了预编译版本的watchman。 React Native 项目运行npm run web&#xff0c;出现如下错误&#xff1a…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…

kubernetes第五天

1.Probe&#xff08;探针&#xff09;之readinessProbe就绪探针&#xff0c;可用性检查 readinessProbe此探针如果检查失败&#xff0c;pod会处于未就绪状态 1.exec方式检查 #通过rc资源创建了三个pod,然后使用services资源&#xff0c;对外提供三个pod的容器的访问入口。 ap…

优化提示词改善答疑机器人回答质量

1.通过优化提示词来调整大模型的回答 1.1使用场景 默认提示词无法满足业务要求。 回答的内容太简单/困难&#xff0c;输出内容/格式/语气达不到要求等 1.2llama-index 的提示词模版 1.2.1llama-index 的默认模板 from llama_index.llms.dashscope import DashScope from lla…

计算机网络 笔记 物理层

物理层的目的:主要为了实现相邻节点之间的数据的传输(01010....) 通信基础概念 信源:信号的发送方 信宿:信号的接收方 信道:信号的通道,通常一个物理的线路包含了两个:发送信道和接受信道 信号:数据的载体,有两种分别是 数字信号:离散的信号值 模拟信号:连续的信号值 马元…

Visio 画阀门 符号 : 电动阀的画法

本篇文章介绍阀门&#xff0c;很多朋友在利用Visio绘画管道流程简图时&#xff0c;需要进行阀门符号的绘画&#xff0c;而Visio提供的阀门符号种类并不是很齐全。 本篇文章给出电动阀的画法&#xff1a; 下图是液动阀的符号&#xff1a; 首先&#xff0c;找到“更多形状”中的…

Flutter:封装一个自用的bottom_picker选择器

效果图&#xff1a;单列选择器 使用bottom_picker: ^2.9.0实现&#xff0c;单列选择器&#xff0c;官方文档 pubspec.yaml # 底部选择 bottom_picker: ^2.9.0picker_utils.dart AppTheme&#xff1a;自定义的颜色 TextWidget.body Text() <Widget>[].toRow Row()下边代…

这是什么操作?强制迁移?GitLab 停止中国区用户访问

大家好&#xff0c;我是鸭鸭&#xff01; 全球知名代码托管平台 GitLab 发布通告&#xff0c;宣布不再为位于中国大陆、香港及澳门地区的用户提供访问服务&#xff0c;并且“贴心”建议&#xff0c;可以访问极狐 GitLab。 极狐 GitLab 是一家中外合资公司&#xff0c;宣称获得…

协方差矩阵

协方差矩阵是一个对称矩阵&#xff0c;用来描述多个随机变量之间的协方差关系。协方差反映了两个随机变量如何共同变化的趋势&#xff0c;协方差矩阵将这种关系扩展到了多维数据。 1. 定义 假设有一个 n 维随机向量 &#xff0c;协方差矩阵 Σ 定义为&#xff1a; 其中&#…

计算机网络——网络层—IP数据报与分片

一、IP 数据报的格式 • 一个 IP 数据报由首部和数据两部分组成。 • 首部的前一部分是固定长度&#xff0c;共 20 字节&#xff0c;是所有 IP 数据报必须具有的。 • 在首部的固定部分的后面是一些可选字段&#xff0c;其长度是可变的。 IP 数据报首部的固定部分中的各字段 版…

QT自定义工具条渐变背景颜色一例

使用样式定义&#xff1a; QWidget* toolbar new QWidget(this);toolbar->setObjectName("main_tool");toolbar->setStyleSheet("#main_tool{background: qlineargradient(x1:0 , y1:0 , x2:1 , y2:0,""stop:0 rgba(0,255,0, 0.2),"&q…

Agent | Dify中的两种可选模式

参考 官方文档 Dify 为智能助手提供了两种推理模式&#xff1a; Function calling&#xff08;函数调用&#xff09;和 ReAct 。 Function calling&#xff08;函数调用&#xff09; Function Calling&#xff0c;函数调用&#xff08;即通过识别用户意图调用特定函数来执行…

Linux 文件的特殊权限—ACL项目练习

本文为Ubuntu Linux操作系统- 第二十一期~~ 上期回顾: 【ACL权限控制详解】 更多Linux 相关内容请点击&#x1f449;【Linux专栏】~ 主页&#xff1a;【练小杰的CSDN】 文章目录 项目项目要求具体的设置命令如下问题2问题3第一步&#xff1a;设置默认ACL前&#xff0c;在projec…

运放输入偏置电流详解

1 输入阻抗与输入偏置电路关系 在选择运放和仪表运放时&#xff0c;经常听到这样的说法&#xff1a;“需要非常高的输入阻抗”&#xff0c;事实上真实如此吗&#xff1f; 输入阻抗&#xff08;更确切的说是输入电阻&#xff09;很少会成为一个重要的问题&#xff08;输入电容也…