二刷力扣--二叉树(1)基础、遍历

news2024/11/24 12:12:12

二叉树基础

常见的二叉树。

两类特殊的二叉树,满二叉树和完全二叉树。
满二叉树即一棵节点满了的二叉树,想要再添加一个节点只能添加一层了。
在这里插入图片描述

完全二叉树:照着满二叉树从上到下,从左到右的顺序添加节点,中间的过程都是完全二叉树。
在这里插入图片描述

二叉搜索树
可以用来做二分搜索的树。满足左<根<右的性质。
在这里插入图片描述

平衡二叉树
左右两个子树的高度差的绝对值不超过1

二叉树的遍历

递归遍历

递归三要素:

  1. 函数参数和返回值
  2. 终止条件
  3. 单层递归逻辑

用三要素写前序遍历:

  1. 参数和返回值。 前序遍历需要知道当前节点,还需要一个数组保存节点的值。不需要返回值。
def traversal(cur, vec):
  1. 终止条件。 如果当前节点是空节点,则需要返回。
if not cur:
	return None
  1. 单层递归逻辑。 单层的逻辑是,取根节点值,然后遍历左子树,遍历右子树。
vec.append(cur.val)
traversal(cur.left, vec)
traversal(cur.right, vec)
class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        def preorder(cur, vec):
            if not cur:
                return None
            vec.append(cur.val)
            preorder(cur.left, vec)
            preorder(cur.right, vec)
            
        vec = []
        preorder(root, vec)
        return vec 

改变一下遍历的顺序,可以写出中序遍历和后序遍历。
中序:

preorder(cur.left, vec)
vec.append(cur.val)
preorder(cur.right, vec)

后序:

preorder(cur.left, vec)
preorder(cur.right, vec)
vec.append(cur.val)

迭代遍历

使用栈来替代递归。

前序遍历。(根,左,右)
注意入栈顺序,用pop弹出栈顶元素(根)后,接着将右子树入栈,然后左子树入栈。这样出栈的时候才是根左右。

class Solution:  
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:  
        st = []  
        res = []  
        if root == None:  
            return res  
        st.append(root)  
        while (len(st)>0):  
            cur = st.pop()  
            res.append(cur.val)  
            if cur.right:  
                st.append(cur.right)  
            if cur.left:  
                st.append(cur.left)  
  
        return res

后序遍历(左,右,根)。只要在前序基础上调整一下, 对调 加入 右左孩子 顺序(得到根右左), 并反转结果(左右根)。

class Solution:  
    def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:  
        res = []  
        st = []  
        if not root:  
            return res  
  
        st.append(root)  
        while (len(st) > 0):  
            cur = st.pop()  
            res.append(cur.val)  
            if cur.left:  
                st.append(cur.left)  
            if cur.right:  
                st.append(cur.right)  
  
        return res[::-1]

中序遍历比较特殊,因为访问和处理节点的顺序不一样。
使用指针cur 辅助访问节点。栈st用来处理节点。
如果cur不为None,就往左走,并且用st记录经过的节点。(访问过程)
如果cur为None了,cur = st.pop()弹出元素,处理数据(中),然后访问右。

class Solution:  
    def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:  
        res = []  
        if not root:  
            return res  
        st = []  
        cur = root  
        while cur or st:  
            if cur: # cur指针访问节点,直到最左  
               st.append(cur)  
               cur = cur.left # 左  
            else:  
                cur = st.pop() # 要处理的数据(根)  
                res.append(cur.val)  
                cur = cur.right # 右  
        return res

层序遍历

层序遍历是逐层访问。可以用队列实现,先确定当前层的节点数为length,然后遍历length次, 处理当前节点并添加节点的左右子节点。

from collections import deque
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        res = []
        if not root:
            return res
        queue  = deque()
        queue.append(root)
        while queue:
            sub_list  = []
            length = len(queue)
            for i in range(length):
                node = queue.popleft()
                sub_list.append(node.val)
                for nextnode in [node.left, node.right]:
                    if nextnode:
                        queue.append(nextnode)

            res.append(sub_list)
        return res

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

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

相关文章

安装VS2015时提示安装包丢失或损坏

今天安装VS2015社区版本时&#xff0c;提示缺失以下两个内容&#xff1a; Microsoft VisualStudio JavaScript Project System : 找不到元素。 Microsoft VisualStudio JavaScript Language Service : 系统找不到指定的文件。 虽然似乎不影响C代码的运行&#xff0c;但是我怕有…

数据结构_复杂度讲解(附带例题详解)

文章目录 前言什么是数据结构&#xff1f;什么是算法&#xff1f;一. 算法的时间复杂度和空间复杂度1.1 算法效率1.2 如何衡量一个算法好坏 二. 时间复杂度2.1 时间复杂度概念例题一例题一分析 实例一实例一分析 三. 空间复杂度实例实例问题解析 四. 常见复杂度对比五. 常见时间…

Linux查找文件内容的命令

在Linux中&#xff0c;您可以使用以下命令来查找文件内容&#xff1a; grep命令&#xff1a; grep命令用于在文件中搜索指定的文本模式&#xff0c;并将包含匹配的行打印出来。语法如下&#xff1a; grep "要查找的文本" 文件名例如&#xff0c;要在名为example.txt的…

激光雷达录制pcap类型的包

查看IP 上图中的eno1就是网卡名&#xff0c;就可以使用如下命令录制 sudo tcpdump -i eno1 host 192.168.1.200 -w lidar.pcap-i 后面是网卡名&#xff0c;host 后面是ip&#xff0c;-w后是pcap包名称。

在Spring Boot API Gateway中实现Sticky Session

文章目录 小结问题在API Gateway中实现Sticky Session在同一个API Gateway中同时支持Sticky Session和RoundRobinLoadBalancer参考 小结 在Kubernetes微服务的云环境中&#xff0c;如何在Spring Boot API Gateway中实现Sticky Session&#xff0c;当服务请求被某一个服务器处理…

晶码存档&改造【01】模板导入租户登录

app101改造之前 想搞一个设备导入功能&#xff0c; 想象中 实际上 再改改样式 关于数据的导入导出&#xff1a; 可见博客 APEX数据源加载实现Excel表数据导入及自定义存储过程_王小小鸭的博客-CSDN博客https://blog.csdn.net/clover_oreo/article/details/132575970?csdn_s…

华为HCIA(五)

Vlan id 在802.1Q中 高级ACL不能匹配用户名和源MAC 2.4G频段被分为14个交叠的&#xff0c;错列的20MHz信道&#xff0c;信道编码从1到14&#xff0c;邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设备异常发生时会发送trap报文 D类地址是…

【git】超详细使用指令

git指令 暂存区工作区提交到暂存区暂存区覆盖到工作区暂存区移除文件暂存区提交到版本库 git储藏场景条件 版本库版本库回退 忽略文件新建.gitignore文件&#xff0c;填入相应配置忽略文件 分支创建分支命令切换分支命令查看所有分支 分支合并切回要合入的分支上合并其他分支过…

数据结构--希尔排序

目录 希尔排序的定义 给一个序列进行希尔排序 希尔排序的算法实现 算法性能分析 1.时间复杂度 2.稳定性 3.适用性 知识点回顾 希尔排序的定义 给一个序列进行希尔排序 第一趟d可以是元素个数/2 相距为4的子表 对子表进行直接插入排序&#xff08;由小到大&#xf…

在Windows10中打开控制面板的5种方法以及如何设置环境变量

在Windows10中打开控制面板的5种方法 方法一&#xff1a;在Windows10中通过运行命令打开控制面板方法二&#xff1a;从Windows 10中的桌面访问控制面板方法三&#xff1a;在Windows10中使用搜索启动控制面板方法四&#xff1a;在Windows10桌面上创建控制面板快捷方式方法五&…

Proxyman Premium for Mac:网络调试和分析工具的终极选择

如果你在寻找一款强大而高效的网络调试和分析工具&#xff0c;那么Proxyman Premium for Mac绝对值得你的关注。这款工具专为Mac用户设计&#xff0c;旨在帮助开发人员、网络管理员和技术专业人员解决网络相关问题&#xff0c;同时提供一系列强大的功能来满足他们的需求。 Pro…

嵌入式软件测试

1.etest的使用 里面有“包教包会.pptx”按照ppt完成安装及题目下载和测试. 1&#xff09;安装etest &#xff08;解压 &#xff0c;注意盘根目录下解压&#xff09; 2&#xff09;安装vspd &#xff08;解压 &#xff09; 3&#xff09;使用vspd端口配置 &#xff08;…

[ MySQL] — 事务管理

什么是事务&#xff1f; 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一个整体。MySQL提供一种机制&#xff0c;保证我们达到这样的效果。事务还规定不同的客户端看到的数据是…

易点易动系统帮助制药企业提供智能化固定资产管理方案

制药企业作为大宗重资产行业,其生产车间内各种设备及仪器往往复杂、种类繁多、数量众多。高效管理这些固定资产对企业生产作业来说显得尤为重要。但是,传统手写账目或excel电子表格等管理模式已不能适应如今海量资产的管理需求。易点易动专业从事固定资产管理领域多年,通过自主…

Vue的第二章节之模版语法(带你感受来自Vue模版语法的魅力)

目录 ​编辑 前言 一、了解模版语法 1. 什么是模版语法 2. 应用场景 3. 对开发的作用 二、插值 1. 文本 2. HTMLj解析 3. 表达式 三、指令 1. v-if/v-else-if/v-else的使用 2. v-show v-show与v-if的区别 3. v-for v-for的使用 扩展&#xff08;下拉框&#x…

selenium中ActionChains方法详细讲解

前言 本文将介绍Selenium中的ActionChains类及其使用方法&#xff0c;帮助您模拟用户在网页上的鼠标和键盘操作。了解ActionChains的常用方法和示例代码&#xff0c;可轻松实现移动鼠标、点击元素、拖拽元素等操作。通过本文的学习&#xff0c;您能更好地应用ActionChains解决自…

Oracle for Windows安装和配置——Oracle for Windows软件安装

2. Oracle for Windows安装和配置 2.1. Oracle for Windows软件安装 2.1.1. 准备Oracle软件 1&#xff09;下载或拷贝安装软件 下载地址:otn.oracle.com或my oracle support。下载文件列表。具体如图2.1.1-1所示。 图2.1.1-1 下载文件列表 --说明&#xff1a; 1&#xff0…

flink-connector-mysql-cdc

FlinkCDC是一个实现CDC(Change Data Capture)思想的数据同步工具。 借助于Flink CDC Connector &#xff0c;它监听数据库的二进制日志文件&#xff0c;来获取数据库变更的数据&#xff0c;以此实现数据同步。 1. 下载Flink 及 对应版本的 Flink CDC FlinkCDC 支持的 Connect…

升级:远程桌面软件玩游戏指南

你有没有遇到过这样的场景&#xff1a;你想玩一款特定的游戏&#xff0c;但却受到设备功能的限制&#xff1f;这就是游戏远程桌面的概念变得非常宝贵的地方。从本质上讲&#xff0c;它允许您远程利用高端游戏计算机的功能&#xff0c;使您能够在自己的设备上玩游戏。 可以考虑…

四、JAVA语言基础

JAVA语言基础 JAVA语言基础1.1.Java主类结构1.1.1.包声明1.1.2.声明成员变量和局部变量1.1.3.编写主方法1.1.4.导入API类库 —————————————————————————————————————————————————— JAVA语言基础 很多人认为在学习Java语言之…