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

来源:互联网 发布:合肥气象数据 编辑:程序博客网 时间:2024/06/07 06:56


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
原创粉丝点击