程序员的资源宝库

网站首页 > gitee 正文

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

sanyeah 2024-03-29 17:58:05 gitee 6 ℃ 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]

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表