• 106从中序和后序遍历序列构造二叉树


    # Definition for a binary tree node.
    class TreeNode:
    def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None
    from typing import List
    # 首先我们需要明白,二叉树的前序遍历,中序遍历和后序遍历分别是什么。
    # 前序遍历:根——左——右
    # 中序遍历:左——根——右
    # 后序遍历:左——右——根
    # 因此我们可以看到这个案例
    # 中序遍历 inorder = [9,3,15,20,7]
    # 后序遍历 postorder = [9,15,7,20,3]
    # 后序遍历的根节点一定是在最后,那我们可以根据后序遍历寻找到根节点,
    # 然后根据根节点的值找到根节点在中序遍历中的位置,在中序遍历中根节点左边的是
    # 左子树,右边是右子树,那么我们找到左右子树的长度,
    # 而在后序遍历中,前边是左子树,中间是右子树,最后是根节点。
    # 那么我们可以根据左子树和右子树的长度来继续进行遍历。
    # ps:这里我们所说的前提都是在二叉树的所有节点都不重复的前提下。
    class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
    return self.dfs(inorder,postorder)
    def dfs(self,inorder,postorder):
    # 这里如果列表为空,那么就返回None,代表着已经到了叶子节点。
    if inorder == []:
    return None
    # 找到根节点。
    val = postorder[-1]
    # 找到根节点在中序遍历列表的位置
    for i in range(len(inorder)):
    if inorder[i] == val:
    break
    # 定义根节点。
    root = TreeNode(val)
    # 继续向下遍历,寻找左右子树。
    root.left = self.dfs(inorder[:i],postorder[:i])
    root.right = self.dfs(inorder[i+1:],postorder[i:len(postorder) - 1])
    # 最后返回。
    return root
  • 相关阅读:
    减绳子 [二分查找]
    *数据删除*OJ的原题大赏
    多项式大总结
    【YBTOJ】【Luogu P6218】[USACO06NOV] Round Numbers S
    【YBTOJ】【HDU3652】B-number
    【Luogu P5752】[NOI1999] 棋盘分割
    【YBTOJ】【UVA10559】方块消除 Blocks
    【YBTOJ】【Luogu P5020】[NOIP2018 提高组] 货币系统
    【YBTOJ】【Luogu P4180】[BJWC2010]严格次小生成树
    【YBTOJ】【Luogu P2680】[NOIP2015 提高组] 运输计划
  • 原文地址:https://www.cnblogs.com/cong12586/p/13728397.html
Copyright © 2020-2023  润新知