ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

从前序与中序遍历序列构造二叉树(Python实现)

2022-02-07 12:02:32  阅读:230  来源: 互联网

标签:preorder 遍历 Python 中序 self 二叉树 root 前序


从前序与中序遍历序列构造二叉树(Python实现)

一、了解三种树的遍历(前、中、后)

  1. 前序:根、左、右
  2. 中序:左、根、右
  3. 后序:左、右、根

前序遍历顾名思义就是根在最前面遍历,中序就是根在中间,后续就是根在后面。

# 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        list1 = []
        def preorder(root):
            """
            preorder就是前序遍历的算法实现(可以把这个算法当作规律)
            1.如果节点不为空,继续前序遍历
            2.输出当前节点(当作根)
            3.如果当前节点的左字树不为空,则继续前序遍历
            4.如果当前节点的右子树不为空,则继续前序遍历
            这里要注意左子树的递归,他没递归完,是不会执行右子树的递归的
            """
            if root is None: return
            list1.append(root.val)
            preorder(root.left)
            preorder(root.right)
        preorder(root)
        return list1

接下来做个题来检验一下吧

在这里插入图片描述

二、了解前序和中序遍历的序列规律(参照Leetcode第105题解)

结合上图

递归思路

  1. 前序遍历的形式总是:[ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]

    即根节点总是前序遍历中的第一个节点。

  2. 中序遍历的形式总是:[ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]

只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。

这样以来,我们就知道了左子树的前序遍历和中序遍历结果,以及右子树的前序遍历和中序遍历结果,我们就可以递归地对构造出左子树和右子树,再将这两颗子树接到根节点的左右位置。

三、代码实现

# 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 len(preorder) > 0:
            root = TreeNode(preorder[0])
            index = inorder.index(preorder[0])
            root.left = self.buildTree(preorder[1:index+1], inorder[:index])
            root.right = self.buildTree(preorder[index+1:], inorder[index+1:])
            return root

参考文章

标签:preorder,遍历,Python,中序,self,二叉树,root,前序
来源: https://blog.csdn.net/m0_46127185/article/details/122806721

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有