【每日一同】先序遍历还原二叉树

又是一道二叉树的题目,核心还是想清楚递归和迭代的问题。
在这里插入图片描述

之前我们做过还原二叉树的题目,那道题目的是给出了中序遍历和前(后)序遍历,实现还原。简单复习一下那道题目的思想。利用了中序遍历的特点,把前后序遍历一分为二,递归解决。

这道题目,给出的条件实际上是先序遍历,和每个节点对应的深度,并且给出了假设,如果只有一个节点就一定是左节点。

因此我们就按照先序遍历的方法,依次构建左节点并存入一个列表,列表对应的索引其实相当于是深度,然后如果当前节点的深度小于栈的索引,弹出元素到栈顶元素索引+1==深度,构建右节点。

# 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:
        path, i = [], 0
        while i<len(S):
        	# 统计节点的深度
            dep = 0
            while S[i] == '-':
                dep += 1
                i += 1
            # 得到节点的数值
            val = 0
            while i<len(S) and S[i].isdigit():
                val = val*10 + int(S[i])
                i += 1
            node = TreeNode(val)
            # 如果深度等于栈顶元素的索引,添加左节点,否则右节点
            if dep == len(path):
                if path:
                    path[-1].left = node
            else:
                path = path[:dep]
                path[-1].right = node
            path.append(node)
        return path[0]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值