【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:

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
        

 

posted @ 2019-04-01 10:24  seyjs  阅读(102)  评论(0编辑  收藏  举报