当前位置: 首页 > wzjs >正文

三合一网站建设报价公众号开发网站公司

三合一网站建设报价,公众号开发网站公司,wordpress素锦下载,深圳网络推广案例题目: 给定两个整数preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。 前言: 二叉树前序遍历的顺序为:先遍历根节点;随后递归地遍…

题目:

给定两个整数preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。


前言:

二叉树前序遍历的顺序为:先遍历根节点;随后递归地遍历左子树;最后递归地遍历右子树。

二叉树中序遍历的顺序为:先递归地遍历左子树;随后遍历根节点;最后递归地遍历右子树。

方法一:递归

对于任意一颗树而言,前序遍历的形式总是:

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

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

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

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

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

在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。可以考虑使用哈希表来帮助快速地定位根节点。对于哈希映射中的每个键值对,键表示一个元素(节点的值),值表示其在中序遍历中的出现位置。

在构造二叉树的过程之前,我们可以对中序遍历的列表进行一遍扫描,就可以构造出这个哈希映射。在此后构造二叉树的过程中,就只需要 O(1) 的时间对根节点进行定位了。

前序遍历:0[root[左子树][右子树]]n-1

中序遍历:0[[左子树],root,[右子树]]n-1

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def buildTree(self, preorder, inorder):""":type preorder: List[int]:type inorder: List[int]:rtype: Optional[TreeNode]"""#辅助递归函数,用来递归地构造二叉树,接收4个参数,表示节点区间def myBuildTree(preorder_left,preorder_right,inorder_left,inorder_right):if preorder_left>preorder_right:return Nonepreorder_root=preorder_left#第一个节点总是当前子树的根节点inorder_root=index[preorder[preorder_root]]#根节点在中序遍历数组中的位置,构建的 index 哈希表可以快速找到根节点的位置。root=TreeNode(preorder[preorder_root])#当前子树的根节点 size_left_subtree=inorder_root-inorder_left#计算左子树的节点数。左子树的节点数等于中序遍历中,根节点左边部分的长度root.left=myBuildTree(preorder_left+1,preorder_left+size_left_subtree,inorder_left,inorder_root-1)#构造左子树。#左子树的节点在前序遍历中从 preorder_left + 1 到 preorder_left + size_left_subtree 之间,而在中序遍历中,节点的范围是 inorder_left 到 inorder_root - 1。递归调用 myBuildTree 来构建左子树root.right=myBuildTree(preorder_left+size_left_subtree+1,preorder_right,inorder_root+1,inorder_right)#递归构造右子树。右子树的节点在前序遍历中从 preorder_left + size_left_subtree + 1 到 preorder_right 之间,在中序遍历中从 inorder_root + 1 到 inorder_right 之间。递归调用 myBuildTree 来构建右子树。return rootn=len(preorder)index={element:i for i,element in enumerate(inorder)}return myBuildTree(0,n-1,0,n-1)

时间复杂度:O(n)

空间复杂度:O(n)


方法二:迭代

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def buildTree(self, preorder, inorder):""":type preorder: List[int]:type inorder: List[int]:rtype: Optional[TreeNode]"""if not preorder:return Noneroot=TreeNode(preorder[0])#创建一个树的根节点,根节点是 preorder 数组中的第一个元素stack=[root]inorderIndex=0for i in range(1,len(preorder)): #遍历剩余的前序遍历节点preorderVal=preorder[i]#获取当前遍历的前序节点值node=stack[-1]#取栈顶元素 nodeif node.val !=inorder[inorderIndex]: #判断当前栈顶节点的值是否与中序遍历数组中的当前元素相同,如果不同,说明当前节点是左子节点,继续构建左子树node.left=TreeNode(preorderVal)#如果当前节点是左子节点,就创建一个新的左子节点stack.append(node.left)else:#如果栈顶节点的值和中序遍历数组中的当前元素相同,说明当前节点是右子节点while stack and stack[-1].val==inorder[inorderIndex]:node=stack.pop()#弹出栈顶节点,表示已经处理完它的左子树inorderIndex+=1node.right=TreeNode(preorderVal)#创建一个新的右子节点,并将其赋给当前节点的右子树stack.append(node.right)return root

时间复杂度:O(n)

空间复杂度:O(n)

源自力扣官方题解

http://www.dtcms.com/wzjs/442903.html

相关文章:

  • wordpress编辑后台宁波seo外包推广公司
  • 自助提卡网站怎么做模板建站的网站
  • 飘仙我的网站加上www不能访问中国站长网入口
  • 域名备案时网站名字在线制作网站免费
  • 微信公众号绑定网站网店运营教学
  • 免费自己制作logo的网站关键词营销优化
  • 苏州做网站最好公司百度推广怎么操作流程
  • seo查询爱站淄博网站优化
  • 体育 网站建设询价函格式windows优化大师的作用
  • 网站项目开发的一般流程怎么自己注册网站
  • 做网站的公司利润怎么自己弄一个网站
  • 网站虚拟空间作用如何创建网站平台
  • 路由器做内部网站服务器媒体公关公司
  • 做外贸网站哪里好深圳网站提升排名
  • 上城区网站建设价格重庆网络推广公司
  • 韩国男女做那个视频网站交换链接营销实现方式解读
  • 判断电脑和手机访问网站seo外包多少钱
  • 杭州专业网站制作设计深圳网络推广服务公司
  • 做ppt的图片素材网站seo优化前景
  • 搜索网站怎么做整合营销方案怎么写
  • 请问番禺哪里有做网站的百度入驻
  • 网站建设属政府采购项目吗app关键词排名优化
  • 济南建网站要百度惠生活怎么做推广
  • 天水营销型网站建设页优化软件
  • 外国人做网站su搜索引擎优化
  • 易橙云做的网站怎么样网络营销的表现形式有哪些
  • 免费金融发布网站模板下载东莞网络公司电话
  • 长春火车站到长春机场大巴时刻表百度sem竞价托管
  • 上海市住房与建设委员会网站新人跑业务怎么找客户
  • 网站建设用哪个软件外贸网