【leetcode】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
'#'
representingnull
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:
Input:"9,3,4,#,#,1,#,#,2,#,6,#,#"
Output:true
Example 2:
Input:"1,#"
Output:false
Example 3:
Input:"9,#,#,1"
Output:false
解题思路:我的方法是模拟树的遍历,依次pop出preorder中的节点存入queue中,用direction记录遍历的方向。direction=1表示往左子树方向的,等于2表示往右子树方向,遇到#号则变换一次方向。如果preorder的顺序是合法的,那么最后的结果一定是preorder和queue里面都是空。
代码如下:
class Solution(object): def isValidSerialization(self, preorder): """ :type preorder: str :rtype: bool """ if preorder == '#': return True elif preorder[0] == '#': return False preorder = preorder.split(',') direction = 1 queue = [int(preorder.pop(0))] while len(queue) > 0 and len(preorder) > 0: item = preorder.pop(0) if item == '#': direction += 1 if direction % 3 == 0: direction -= 1 queue.pop(-1) continue queue.append(item) return len(preorder) == 0 and len(queue) == 0