331. Verify Preorder Serialization of a Binary Tree
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 null
pointer.
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
思路:
提示采用栈,因此,采用这样的思路,一旦遇到两个"#",说明遇到一个叶子节点,它是有效的,可用一个"#"代替3个字符串组成的这个节点。例如,有”1,#,#“,可用”#“将其替代。
对于例题中"9,3,4,#,#,1,#,#,2,#,6,#,#"的处理流程:不断往栈中输入
1. 9,3,4,#,#==>9,3,#
2, 9,3,#,1,#,#==>9,3,#,#==>9,#
3. 9,#,2,#,6,#,#==>9,#,2,#,#==>9,#,#==>#
bool isValidSerialization(string preorder) {
stack<char> stkc;
int n=preorder.size();
for(int i=0;i<preorder.size();i++)
{
char ch=preorder[i];
if(ch==','||(i>0&&preorder[i-1]!=','&&ch!=',')) continue;
while(stkc.size()>1&&stkc.top()=='#'&&ch=='#')
{
stkc.pop();
if(stkc.top()=='#')
return 0;
stkc.pop();
}
stkc.push(ch);
}
return stkc.size()==1&&stkc.top()=='#';
}