【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

相关文章

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 &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

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

题目: 题解: 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 & MASK1) == 0) {return

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}