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'#' representingnull pointer.
Note: You may assume that the input format is always valid, for example if could never contain two consecutive commas such as "1,,3" For example: "9, 3, 4, #, #, 1, #, #, 2, #, 6, #, #", return true "1, #" return false "9, #, #, 1" return false*/
_9_
/ \
3 2
/ \ / \
4 1 # 6
/ \ / \ / \
# # # # # #
_9_
/ \
3 2
/ \ / \
# 1 # 6
/ \ / \
# # # # we substitute the "4, #, #" to "#"
By doing this recursively, the final result will be a only a "#" left.
#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
bool isValidSerialization(string preorder) {
if(preorder.size() == 0) return true;
if(preorder.size() % 2 == 0) return false;
stack<char> nodes;
for(int i = 0; i < preorder.size(); ++i) {
if(preorder[i] == ',') continue;
if(nodes.size() >= 3) {
char tmp_1 = nodes.top();
if(tmp_1 == '#') {
nodes.pop();
char tmp_2 = nodes.top();
if(tmp_2 == '#') {
nodes.pop();
nodes.pop();
nodes.push('#');
} else {nodes.push(tmp_1);}
}
}
nodes.push(preorder[i]);
}
return !nodes.empty() && (nodes.top() == '#');
}
int main(void) {
string preorder_test = "9, 3, 4, #, #, 1, #, #, 2, #, 6, #, #";
cout << isValidSerialization(preorder_test) << endl;
string preorder_test1 = "1, #";
cout << isValidSerialization(preorder_test1) << endl;
string preorder_test2 = "9, #, #, 1";
cout << isValidSerialization(preorder_test2) << endl;
}
本文介绍了一种不重建树即可验证二叉树预序遍历序列化字符串正确性的算法。通过对序列中每个节点进行处理,并利用栈来递归替换已验证的子树为空节点,最终确保整个序列的有效性。
569

被折叠的 条评论
为什么被折叠?



