您的位置:首页 > 其它

leetcode 331. Verify Preorder Serialization of a Binary Tree

2016-04-30 23:05 435 查看
传送门

331. Verify Preorder Serialization of a Binary Tree

My Submissions
QuestionEditorial Solution

Total Accepted: 10790 Total Submissions: 34071 Difficulty: Medium

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


题意:
判断给的字符串 是不是一个合法的 前序遍历

思路:
用栈,如果 一个节点的 左子树 和 右子树 都 true 的话,该节点 向上返回true

false的情况:
1. 某个节点已经 左子树 和 右子树 都遍历过了,后续又 涉及到该节点的儿子(如 1,#,#,#)
2. 根节点是 已经 访问结束,后续还有其它节点 (#,1 或 1,#,#,1)

150 / 150 test cases passed.
Status:

Accepted

Runtime: 8 ms
class Solution {
public:
bool isValidSerialization(string preorder) {
int l = preorder.length();
if(preorder[0] == '#'){
if(l == 1) return true;
else return false;
}
int i = 0;
stack<int> s;
s.push(0);
while(i<l && preorder[i] != ',') i++;
i++;
int te;
while(i < l)
{
if(preorder[i] == '#'){
if(s.empty() == 1) return false;
while(!s.empty())
{
te = s.top();
if(te == 2) return false;
s.pop();
s.push(te + 1);
te = s.top();
if(te == 1){
break;
}
if(te == 2 ){
s.pop();
}
}
if(s.empty() == 1 && i < l - 1) return false;
}
else{
s.push(0);
}
while(i < l && preorder[i] != ',') i++;
i++;
}
if(s.size() == 0) return true;
return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: