栈_Hard_1028_从先序遍历还原二叉树

文章目录

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

  • 虽说标签是hard类型的,但是题目不难
  • 具体思路如下:
  • 节点树为 1~1000,可以判定首节点一定存在
  • 首先提取出root节点,和深度一起拼成tuple,放到一个栈中 (数组也行)
  • 然后遍历剩余节点,统计其深度 和 数值 (深度用-表示)
  • 然后 遍历到的剩余节点的深度 和 栈中最后一个节点的深度 只有 大于、等于 和 小于 3 种情况。
  • 如果是大于,只可能深度比前者大1
  • 如果是小于,那可能小任意值,这里用循环pop出栈中深度不等的node
  • 代码如下:
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def recoverFromPreorder(self, S: str) -> TreeNode:
        import collections
        queue = collections.deque()
        index = 0
        while index < len(S) and S[index] != '-':
            index += 1
        Head = TreeNode(int(S[:index]))
        queue.append((Head, 0))  # node, node's deepth
        num, cnt, key = 0, 0, True  # 节点值, 节点值前的横线数
        for i in range(index, len(S)):
            if S[i] == '-':
                cnt += 1
            else:
                num = num*10 + int(S[i])
                if i+1 == len(S) or (i+1 < len(S) and S[i+1] == '-'):
                    node = TreeNode(num)
                    while cnt < queue[-1][1]:  # 深度小于上一个节点的深度
                        queue.pop()
                    if cnt == queue[-1][1] + 1:  # 比上个节点深1层
                        if not queue[-1][0].left:  # left 为空
                            queue[-1][0].left = node
                        else:
                            queue[-1][0].right = node
                    elif cnt == queue[-1][1]:  # 和上一个节点深度相同
                        queue.pop()
                        queue[-1][0].right = node
                    queue.append((node, cnt))
                    num, cnt = 0, 0

        return Head

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值