【Leetcode】331. 验证二叉树的前序序列化

2024-04-01 17:04

本文主要是介绍【Leetcode】331. 验证二叉树的前序序列化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。
在这里插入图片描述
例如,上面的二叉树可以被序列化为字符串 " 9 , 3 , 4 , # , # , 1 , # , # , 2 , # , 6 , # , # " "9,3,4,\#,\#,1,\#,\#,2,\#,6,\#,\#" "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # \# # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

保证 每个以逗号分隔的字符或为一个整数或为一个表示 n u l l null null 指针的 ′ # ′ '\#' #

你可以认为输入格式总是有效的

例如它永远不会包含两个连续的逗号,比如 " 1 , , 3 " "1,,3" "1,,3"
注意:不允许重建树。

示例 1:
输入: p r e o r d e r = " 9 , 3 , 4 , # , # , 1 , # , # , 2 , # , 6 , # , # " preorder = "9,3,4,\#,\#,1,\#,\#,2,\#,6,\#,\#" preorder="9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: t r u e true true

示例 2:
输入: p r e o r d e r = " 1 , # " preorder = "1,\#" preorder="1,#"
输出: f a l s e false false

示例 3:
输入: p r e o r d e r = " 9 , # , # , 1 " preorder = "9,\#,\#,1" preorder="9,#,#,1"
输出: f a l s e false false

提示:

  • 1 ≤ p r e o r d e r . l e n g t h ≤ 1 0 4 1 \leq preorder.length \leq 10^4 1preorder.length104
  • p r e o r d e r preorder preorder 由以逗号 " , " "," "" 分隔的 [ 0 , 100 ] [0,100] [0,100] 范围内的整数和 “ # ” “\#” “#” 组成

思路

这道题要求验证给定的序列是否是正确的二叉树的前序序列化,而且不能重建树。可以使用迭代的方法来模拟整个过程。

可以观察到一个有效的二叉树序列化中,非空节点后面必然跟着两个 ′ # ′ '\#' #表示空节点,因为二叉树中的每个节点都有两个子节点(包括空节点)。所以可以遍历序列,当遇到一个非空节点时,记录之后的两个节点是否为 ′ # ′ '\#' #,如果是则继续遍历,否则返回 f a l s e false false。遍历完成后,如果指针指向了序列的末尾,则返回 t r u e true true,否则返回 f a l s e false false

代码

class Solution {
public:bool isValidSerialization(string preorder) {int p = 0;return dfs(preorder, p) && p == preorder.size();}bool dfs(const string& preorder, int& p) {if (p == preorder.size()) {return false;}if (preorder[p] == '#') {if (p == preorder.size() - 1) p++;else p += 2;return true;}while (p < preorder.size() && preorder[p] != ',') p++;if (p == preorder.size()) return false;p += 1;return dfs(preorder, p) && dfs(preorder, p);}
};

复杂度分析

时间复杂度

遍历整个序列,时间复杂度为 O ( n ) O(n) O(n)

空间复杂度

递归调用的深度最坏情况下为 O ( n ) O(n) O(n)

结果

在这里插入图片描述

总结

使用了递归的方法,通过模拟二叉树的前序遍历来判断序列是否有效。

这篇关于【Leetcode】331. 验证二叉树的前序序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867683

相关文章

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &