leetcode_331. 验证二叉树的前序序列化

举报
悲恋花丶无心之人 发表于 2021/03/15 00:17:37 2021/03/15
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。      _9_     /   \    3     2   / \   / \  4   1  #  6 / \ / \   / \ ...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。

     _9_
    /   \
   3     2
  / \   / \
 4   1  #  6
/ \ / \   / \
# # # #   # #

例如,上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一个空节点。

给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。

每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。

你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 "1,,3" 。

示例 1:

输入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
输出: true

示例 2:

输入: "1,#"
输出: false

示例 3:

输入: "9,#,#,1"
输出: false

二、解题思路

用栈存储数字,‘#’作为出栈的依据;

事先栈中存入一个‘#’;

当栈中最后一个是‘#’且preorder序列最后也是‘#’,则说明是正确的二叉树的前序序列化;

否则若preorder中‘#’还没有到最后位置就与栈中的‘#’匹配,则说明是不正确的。

三、代码


      class Solution:
      def isValidSerialization(self, preorder: str) -> bool:
       stack = ['#']
       i = 0
      while i < len(preorder):
      if preorder[i] == ',':
       i += 1
      continue
      elif preorder[i] == '#':
      if stack[-1] == '#':
      if i == len(preorder) - 1:
       stack.pop()
      else:
      return False
      else:
       stack.pop()
      elif preorder[i] != '#':
       stack.append(preorder[i])
      while i < len(preorder) and preorder[i] != ',':
       i += 1
       i += 1
      return len(stack) == 0
      if __name__ == '__main__':
       s = Solution()
       preorder = "9,3,4,#,#,1,#,#,2,#,6,#,#"
       ans = s.isValidSerialization(preorder)
       print(ans)
  
 

文章来源: blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_36556893/article/details/114686982

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。