首页 > 其他 > 详细

【LeetCode每日一题】2020.6.18 1028. 从先序遍历还原二叉树

时间:2020-06-18 11:46:16      阅读:62      评论:0      收藏:0      [点我收藏+]

1028. 从先序遍历还原二叉树

我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。

给出遍历输出 S,还原树并返回其根节点 root。

示例:

技术分享图片
输入:"1-2--3--4-5--6--7"
输出:[1,2,5,3,4,6,7]

分析:

? 感觉自己讲得不好,贴出官方题解。我觉得关键在于理解递归栈的大小和结点深度的关系。

代码(Python):

class Solution:
    def recoverFromPreorder(self, S: str) -> TreeNode:
        path = []  # 存储结点
        pos = 0  # 存储遍历位置
        while pos < len(S):
            level = 0  # 存储结点深度
            while S[pos] == ‘-‘:
                # 增加结点深度
                level += 1
                pos += 1
            value = 0  # 存储结点值
            while pos < len(S) and S[pos].isdigit():
                value = value * 10 + (ord(S[pos]) - ord(‘0‘))
                pos += 1
            node = TreeNode(value)
            # 如果当前结点深度正好等于目前存储得结点个数,说明该节点就是根结点的左子结点
            if level == len(path):
                if path:
                    path[-1].left = node
            # 说明该节点位于根结点左侧,且是左侧的最后一个结点,即左侧某个结点的右结点
            else:
                path = path[:level]
                path[-1].right = node
            path.append(node)
        return path[0]

【LeetCode每日一题】2020.6.18 1028. 从先序遍历还原二叉树

原文:https://www.cnblogs.com/enmac/p/13156477.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!