
leetcode 331. 验证二叉树的前序序列化
数字节点: null节点(#):
发布日期:2021-05-14 09:10:57
浏览次数:12
分类:精选文章
本文共 2208 字,大约阅读时间需要 7 分钟。
为了验证给定的前序序列是否是正确的二叉树序列化,可以使用栈来跟踪每个节点的子节点数量。以下是详细的步骤和代码实现。
样例分析
示例1: 输入序列为“9,3,4,#,#,1,#,#,2,#,6,#,#”。
- 栈初始为
[1]
。 - 遇到9:弹出1,减到0,将2入栈,栈为
[2]
。 - 遇到3:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到4:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到1:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到2:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到6:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为空,返回true。
示例2: 输入序列为“1,#”。
- 栈初始为
[1]
。 - 遇到1:弹出1,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为空,返回false。
示例3: 输入序列为“9,#,#,1”。
- 栈初始为
[1]
。 - 遇到9:弹出1,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到1:弹出2,减到1,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为
[2]
。 - 遇到#:弹出2,减到0,将2入栈,栈为空,返回false。
栈方法详解
初始化: 栈中最初放入一个1,表示根节点尚未处理。
遍历每个节点:
- 弹出栈顶元素,减一。
- 如果减到零,表示左子节点已处理完毕,右子节点将要处理,将2入栈。
- 弹出栈顶元素,减一。
- 如果减到零,同样将右子节点(2)入栈。
错误条件:
- 遇到错误的节点(如两连#)。
- 栈为空时处理节点。
- 栈顶元素在处理过程中出现负值。
代码实现
C++代码:
#include#include using namespace std;class Solution {public: bool isValidSerialization(string preorder) { stack childNodes; childNodes.push(1); int len = preorder.length(); for(int i = 0; i < len; ++i) { char ch = preorder[i]; if (ch > '0' && ch < '9') { if (i == len - 1 || preorder[i+1] == ',') { if (childNodes.empty()) return false; if (--childNodes.top() == 0) childNodes.pop(); childNodes.push(2); } } else if (ch == '#') { if (childNodes.empty()) return false; if (--childNodes.top() == 0) childNodes.pop(); } } return childNodes.empty(); }};
Python代码:
class Solution(object): def isValidSerialization(self, preorder): nodes = preorder.split(',') slot = 1 for node in nodes: slot -= 1 if slot < 0: return False if node != '#': slot += 2 return slot == 0
总结
通过上述方法,可以有效地验证给定的前序序列是否是正确的二叉树序列化。栈的使用帮助跟踪每个节点的子节点数量,确保序列符合二叉树的结构要求。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月21日 14时11分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
虚函数
2019-03-09
菱形继承
2019-03-09
RTL设计- 多时钟域按顺序复位释放
2019-03-09
斐波那契数列两种算法的时间复杂度
2019-03-09
int main(int argc,char* argv[])详解
2019-03-09
【Android踩过的坑】7.Android Studio 点击启动项目时进入调试模式
2019-03-09
【Android小技巧】1.快速查看SDK对应的API Level
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
C++清空队列(queue)方法
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
【二叉树】已知后序与中序求先序
2019-03-09
数组范围的动态扩容
2019-03-09
如何选择三种验证类型的https证书
2019-03-09
thinkphp使用163/126邮箱发送
2019-03-09
解决Nginx 404 not found问题
2019-03-09
计算机网络之第三章笔记--数据链路层
2019-03-09
创建型模式之简单工厂模式实例及代码操作
2019-03-09