一、题目
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。
你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 “1,3” 。
示例1:
输入: “9,3,4,#,#,1,#,#,2,#,6,#,#”
输出: true
示例2:
输入: “1,#”
输出: false
示例3:
输入: “9,#,#,1”
输出: false
二、代码
c++:
class Solution {
public:
bool isValidSerialization(string preorder) {
stack<int> 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();
}
};
解题思路:
- 用一个栈,表示各个节点剩余的子节点数量,刚开始时还没有填入,所以是1
- 每遇到一个数字节点,就将栈顶元素-1,如果栈顶元素变为零则出栈,表示栈顶元素表示的节点的可用子节点数已经用完了。然后还需要将2入栈
- 遇到#号,将栈顶元素-1,如果栈顶元素变为0则出栈。
python:
class Solution(object):
def isValidSerialization(self, preorder):
"""
:type preorder: str
:rtype: bool
"""
nodes=preorder.split(',')
slot=1
for node in nodes:
slot-=1
if slot<0:
return False
if node!='#':
slot+=2
return slot==0
解题思路:
类似c++的思路,只不过是用slot表示所有已经遇到的节点的剩余子节点的总数。一开始时slot=1,表示还未填入根节点,然后每遇到一个节点,slot减一,若遇到的是数值,还需要+2