Leetcode: Verify Preorder Serialization of a Binary Tree
2016-02-07 17:33
501 查看
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as
For example, the above binary tree can be serialized to the string
Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.
Each comma separated value in the string must be either an integer or a character
You may assume that the input format is always valid, for example it could never contain two consecutive commas such as
Example 1:
Return
Example 2:
Return
Example 3:
Return
class Solution {
public:
bool isValidSerialization(string preorder) {
int nullCount = 0;
bool isValue = false;
for (int i = preorder.size() - 1; i >= 0; --i) {
if (preorder[i] == '#') {
++nullCount;
}
else if (preorder[i] == ',') {
if (isValue) {
if (nullCount >= 2) {
--nullCount;
}
else {
return false;
}
isValue = false;
}
}
else {
isValue = true;
}
}
return isValue && nullCount == 2 || !isValue && nullCount == 1;
}
};
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as
#.
_9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \ / \ # # # # # #
For example, the above binary tree can be serialized to the string
"9,3,4,#,#,1,#,#,2,#,6,#,#", where
#represents a null node.
Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.
Each comma separated value in the string must be either an integer or a character
'#'representing
nullpointer.
You may assume that the input format is always valid, for example it could never contain two consecutive commas such as
"1,,3".
Example 1:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Return
true
Example 2:
"1,#"
Return
false
Example 3:
"9,#,#,1"
Return
false
怎么是一个合法的二叉树呢?对于叶节点,必定有两个空节点;类似于拓扑排序,可以依次消掉这些节点 - 非叶节点替换成空节点 - 一直到根节点。如果中间过程中发现某个节点的空节点数目小于两个,则是不合法的二叉树。
实现起来可以用堆栈,也可以直接字符串检查。
class Solution {
public:
bool isValidSerialization(string preorder) {
int nullCount = 0;
bool isValue = false;
for (int i = preorder.size() - 1; i >= 0; --i) {
if (preorder[i] == '#') {
++nullCount;
}
else if (preorder[i] == ',') {
if (isValue) {
if (nullCount >= 2) {
--nullCount;
}
else {
return false;
}
isValue = false;
}
}
else {
isValue = true;
}
}
return isValue && nullCount == 2 || !isValue && nullCount == 1;
}
};
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- Java的二叉树排序以及遍历文件展示文本格式的文件树