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 '#'
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
思路:观察可知,将4 以及它下面的两个#,换成一个#,如果原来的list是preorder,那么这个修改之后的list还是。
所以逐次代换,看最后是否是一个#即可。注意如果扫了一遍list之后发现没有可以换的,那么break,return False。
1 class Solution(object): 2 def isValidSerialization(self, preorder): 3 """ 4 :type preorder: str 5 :rtype: bool 6 """ 7 preorder = preorder.split(',') 8 while len(preorder) > 1: 9 n = len(preorder) 10 ind = [] 11 for i in range(0, n-2): 12 if preorder[i] != "#" and preorder[i+1] == "#" and preorder[i+2] == "#": 13 preorder[i] = "#" 14 ind.append(i+1) 15 ind.append(i+2) 16 else: 17 continue 18 preorder = [elem for i, elem in enumerate(preorder) if i not in ind] 19 if len(preorder) == n: 20 break 21 22 if preorder == ["#"]: 23 return True 24 else: 25 return False