当前位置:网站首页>leetcode:331. 验证二叉树的前序序列化
leetcode:331. 验证二叉树的前序序列化
2022-08-09 22:01:00 【OceanStar的学习笔记】
题目来源
题目描述


class Solution {
public:
bool isValidSerialization(string preorder) {
}
};
题目解析
栈
为什么可以用栈
- 我们知道[前序遍历]是按照[根节点-左子树-右子树]的顺序遍历的,只有当根节点的所有左子树遍历完成之后,才会遍历右子树。
- 所以我们可以先判断【左子树】是否有效,【右子树】是否有效,最后判断【根节点-左子树-右子树】是否有效。
- 这个思路类似递归,而把递归改写成循环时,就会使用「栈」,这就是本题使用「栈」的原因。
如何判断一颗树是否有效?
首先考虑最简单的情况:怎么判断一个节点是叶子节点。很明显,当一个节点的两个孩子都是#的时候,该节点就是叶子节点

当一个节点不是叶子节点时,那么它必定至少有一个孩子非空!有两种情况
- 两个孩子都非
# - 一个孩子为
#,一个孩子不为#
为了兼容这两种情况,我们可以把有效的叶子节点使用#替代,此时叶子节点会变成空节点。

如输入: “9,3,4,#,#,1,#,#,2,#,6,#,#” ,当遇到 x,#,# 的时候,就把它变为 #。
模拟一遍过程:
- [9,3,4,#,#] => [9,3,#],继续
- [9,3,#,1,#,#] => [9,3,#,#] => [9,#] ,继续
- [9,#2,#,6,#,#] => [9,#,2,#,#] => [9,#,#] => [#],结束
也就是说:
- 栈顶有两个"#“的时候,连续弹出这两个”#“以及它们的共同父节点,然后将一个”#"入栈。
- 也就是用空节点代替一棵子树。
- 最终栈中只有一个
#
class Solution {
public:
bool isValidSerialization(string preorder) {
std::vector<std::string> stk;
std::stringstream ss(preorder); // 使用 stringstream与getline 分割字符串
string tmp;
while (getline(ss, tmp, ',')){
// 使用 stringstream与getline 分割字符串
stk.push_back(tmp);
int len = stk.size();
// 用「#」替换 「数字##」
while (len >= 3
&& stk[len - 1] == "#"
&& stk[len - 2] == "#"
&& stk[len - 3] != "#"){
stk.pop_back();
stk.pop_back();
stk.pop_back();
stk.emplace_back("#");
len = stk.size();
}
}
// 如果最后模拟栈中只剩一个#,说明是合法的序列
return stk.size() == 1 && stk[0] == "#";
}
};
计算入度出度

如果存在一条有向边 A --> B,则这条边给 A 增加了 1 个出度,给 B 增加了 1 个入度。
类似题目
边栏推荐
- 第十七期八股文巴拉巴拉说(数据库篇)
- 工作经验-组件封装(拖拽排序组件)
- Deceptive Dice
- In programming languages, the difference between remainder and modulo
- Five Star Holdings Wang Jianguo: Deepen the track with "plant spirit" and promote growth with "animal spirit"
- 面试官:MySQL 中 update 更新,数据与原数据相同时会执行吗?大部分人答不上来!
- 小程序+自定义插件的关键性
- typedef和#define的花里胡哨的用法
- R语言修改dataframe数据列的名称:使用dplyr包的rename函数修改列名、使用colnmaes函数修改列名、在数据筛选的时候重命名列名
- Flask入门学习教程
猜你喜欢

Five Star Holdings Wang Jianguo: Deepen the track with "plant spirit" and promote growth with "animal spirit"

孙正义亏掉1500亿:当初投贵了

每日一R「02」所有权与 Move 语义

华为鸿蒙3.0的野望:技术、应用、生态

How to Make Your Company Content GDPR Compliant

AI+Medical: Using Neural Networks for Medical Image Recognition and Analysis

nvm下node安装;node环境变量配置

国内手机厂商曾为它大打出手,如今它却最先垮台……

【微服务~Nacos】Nacos服务提供者和服务消费者

反射机制篇
随机推荐
孙正义亏掉1500亿:当初投贵了
How to Make Your Company Content GDPR Compliant
xctf攻防世界 Web高手进阶区 shrine
反射机制篇
NodeJS使用JWT
navicat 快捷键
五星控股汪建国:以“植物精神”深耕赛道,用“动物精神”推动成长
Flutter 绘制美不胜收的光影流动效果
台风生成,广州公交站场积极开展台风防御安全隐患排查
OKR 锦囊妙计
Interviewer: How to deal with Redis big key?
json case
Jinshanyun earthquake, the epicenter is in bytes?
Analyze the Add() method in Fragment management from the source code
Flask introductory learning tutorial
This article lets you quickly understand implicit type conversion [integral promotion]!
Solution: Edu Codeforces 109 (div2)
R语言patchwork包将多个可视化结果组合起来、使用plot_annotation函数以及tag_level参数将组合图用大写字母进行顺序编码、为组合图的标签添加自定义前缀信息
nvm下node安装;node环境变量配置
README_Albumentations