当前位置:网站首页>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 个入度。
类似题目
边栏推荐
- R语言将列表数据转化为向量数据(使用unlist函数将列表数据转化为向量数据)
- typedef和#define的花里胡哨的用法
- 基于ABP的AppUser对象扩展
- Activiti7审批流
- [Microservice~Nacos] Configuration Center of Nacos
- Liver all night to write a thirty thousand - word all the commands the SQL database, function, speaks clearly explain operators, content is rich, proposal collection + 3 even high praise!
- 【EF】数据表全部字段更新与部分字段更新
- Analyze the Add() method in Fragment management from the source code
- Use convert_to_tensor in Tensorflow to specify the type of data
- js array object deduplication
猜你喜欢
随机推荐
How do task flow executors work?
FileZilla搭建FTP服务器图解教程
Chatting embarrassing scenes, have you encountered it?Teach you to get the Doutu emoticon package with one click, and become a chat expert
L3-2 Delete up to three characters (30 points)
Kubernetes Service对象
R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化散点图、使用scale_x_continuous函数的breaks参数指定X轴的断点的个数(设置参数n)
Solution: Edu Codeforces 109 (div2)
README_Albumentations
【EF】 更新条目时出错。有关详细信息,请参见内部异常。[通俗易懂]
Flask's routing (app.route) detailed
第十七期八股文巴拉巴拉说(数据库篇)
abstract class or interface
Space not freed after TRUNCATE table
C. Omkar and Baseball
PHP 2D array sorted by a field
工作经验-组件封装(拖拽排序组件)
Leetcode.25 K个一组翻转链表(模拟/递归)
R语言ggplot2可视化:使用ggpubr包的ggerrorplot函数可视化误差线(可视化不同水平均值点以及se标准误差)、设置add参数为dotplot添加点阵图
国内手机厂商曾为它大打出手,如今它却最先垮台……
In-depth analysis of Apache EventMesh cloud-native distributed event-driven architecture