331. Verify Preorder Serialization of a Binary Tree【M】【16】【leetcode】

175 篇文章 0 订阅
157 篇文章 0 订阅


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

Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.


Subscribe to see which companies asked this question



根据提示,用栈

被注释的方法,实际上就是模拟了一个用栈解决的全过程

而第二种方法,使用两个int模拟栈的内容,可是速度很慢,不知道为什么

看人家写的,发现可以直接用split,笨死了,没想到




class Solution(object):
    def isValidSerialization(self, preorder):
        #print input
        p = preorder

        if p == '#':
            return True

        if p[-1] != '#' or p[0] == '#':
            return False

        if p.count('#') > len(p) + 1:
            return False

        res = []

        if p == None:
            return False

        count_of_num = 0
        count_of_null = 0
        tag = 0
        for i in range(0,len(p)):

            if str.isdigit(str(p[i])):
                tag = 1
                #continue
            elif p[i] == ',':
                if tag == 1:
                    count_of_num += 1
                    tag = 0
            else:
                count_of_null += 1
                while count_of_null > 1:
                    count_of_null -= 1
                    count_of_num -= 1
                    if count_of_null < 0 or (count_of_num < 1 and i < len(p)-1) :
                        return False

            #if p[i] != ',':
            #    print p[i],count_of_num,count_of_null

        if count_of_num == 0 and count_of_null==1:
            return True
        return False

        '''

        t = 0
        count = 0
        tag = 0
        for i in p:
            if i != ',':
                print i,res

            if str.isdigit(str(i)):
                t = t * 10 + int(i)
                tag = 1
                continue

            if i == ',':
                if tag != 0:
                    res.append(str(t))
                    count += 1
                tag = 0
                continue

            elif i == '#':
                res.append('#')
                while len(res) > 2 and res[-1] == '#' and res[-2] == '#':
                    try:
                        res.pop()
                        res.pop()
                        res.pop()
                        res.append('#')
                        count -= 1
                        print 'count',count
                        if count < 0:
                            return False
                    except:
                        return False

            #print res

        print res

        if res == ['#']:
            return True

        return False
        '''


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值