zoukankan      html  css  js  c++  java
  • Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal

    Description: Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.

    Link: 105. Construct Binary Tree from Preorder and Inorder Traversal

    Examples:

    Example 1:
    Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
    Output: [3,9,20,null,null,15,7]
    
    Example 2:
    Input: preorder = [-1], inorder = [-1]
    Output: [-1]

    思路: 给定二叉树,前中后序遍历,只要递归就可以了,但是怎么从前中序遍历中回复二叉树,就想不出,所以看看题解

    前序遍历的第一个元素是根节点,在中序遍历的list中找到根节点,以此找到根节点的左右子树,以左右子树的长度,切割先序遍历list的左右子树. 递归函数传入preorder, inorder list, 返回根节点,所以将左右子树的preorder, inorder传入,返回左右子树的根节点,递归建树。

    class Solution(object):
        def buildTree(self, preorder, inorder):
            """
            :type preorder: List[int]
            :type inorder: List[int]
            :rtype: TreeNode
            """
            if not preorder or not inorder: return None
            root = TreeNode(preorder[0])
            i = inorder.index(preorder[0])
            root.left = self.buildTree(preorder[1:1+i], inorder[:i])
            root.right = self.buildTree(preorder[i+1:], inorder[i+1:])
            return root

    同样的方法做 106. Construct Binary Tree from Inorder and Postorder Traversal,后序和中序,建二叉树,根节点是后序的最后一个元素。

    class Solution(object):
        def buildTree(self, inorder, postorder):
            """
            :type inorder: List[int]
            :type postorder: List[int]
            :rtype: TreeNode
            """
            if not inorder or not postorder:
                return None
            root = TreeNode(postorder[-1])
            i = inorder.index(postorder[-1])
            root.left = self.buildTree(inorder[:i], postorder[:i])
            root.right = self.buildTree(inorder[i+1:], postorder[i:-1])
            return root
    

    但是上面的方法时间和空间的消耗都很大,和使用递归有关系。

    还是复习一下关于二叉树的遍历吧,深度优先遍历中有先序,中序和后序,广度优先遍历就是按层遍历,比如计算二叉树深度的时候可以用。其中根节点D,左右子树LR, 先中后表示根节点的位置,而左右子树总是LR. 先左后右。递归遍历的时候,print(root.val); traverse(L), traverse(R)安排序列就可。理解了遍历,才可能完全理解怎么逆方向回去。那么给定先后序,能否还原二叉树呢?答案是不能,先和后的功能是一样的,找到root.val,有了中序才能切分左右子树。

    日期: 2021-03-14 每天都在学习,每天也都不在学习。

  • 相关阅读:
    轻量级调试api接口 Jquery.PlayingAPI v 1.0
    js验证整数加保留小数点
    简单漂亮bootstrap grid列表分页 demo.
    polemo-logger 分析
    POSIX 标准的获取(pdf 格式)
    游戏开发利器(工具、资源)
    仅有 265 行的第一人称引擎
    介绍一款非常适合做微网站并且免费的CMS系统
    兔子无限繁殖问题——婓波那契数列
    近似计算
  • 原文地址:https://www.cnblogs.com/wangyuxia/p/14532348.html
Copyright © 2011-2022 走看看