zoukankan      html  css  js  c++  java
  • 【Leetcode】105: 从前序与中序遍历序列构造二叉树

     这题目是有一个常见的套路的,由于先序遍历的结果list都会遵循这样的一个排列方式,也就是第一个是root,后面的分别是左子树的node的集合,以及右子树的node的集合。

    [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]

    而inorder中序遍历的结果则是:

    [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]

    画成下图就可以表示为:

    我们通过preorder拿到root的地址之后,就可以找到root在inorder当中的位置。然后拿到preorder和inorder当中的左子树和右子树,这样就可以对root.left以及root.right进行递归,build出一棵完整的二叉树。

    代码如下:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
            if not preorder or not inorder:  # 递归终止条件,用这个终止条件是因为如果为空,则后面的递归(用分治法的时候)无法进行对list的切片
                return
            root = TreeNode(preorder[0])  
            idx = inorder.index(preorder[0])  
            
            root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx])
            root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
            return root
  • 相关阅读:
    小学二年级四则运算软件需求规格说明书
    周活动总结
    构建之法阅读笔记01
    学习进度条01
    四则运算
    软件工程概论
    课后作业1
    继承与多态-课后作业
    python文件处理-将图像根据坐标画矩形标记
    python文件处理-将图像根据坐标切割成若干小图
  • 原文地址:https://www.cnblogs.com/geeksongs/p/15386573.html
Copyright © 2011-2022 走看看