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

做外卖网站青岛助创网络科技有限公司

做外卖网站,青岛助创网络科技有限公司,沈阳创新网站建设报价,工地施工模板尺寸要求LeetCode-1008. 前序遍历构造二叉搜索树【栈 树 二叉搜索树 数组 二叉树 单调栈】 题目描述#xff1a;解题思路一#xff1a;题目大致意思就是给定一个二叉树的前序遍历#xff0c;求对应的二叉搜索树。一种比较特殊的点是「二叉搜索树」的中序遍历的结果是【有序序列】解题思路一题目大致意思就是给定一个二叉树的前序遍历求对应的二叉搜索树。一种比较特殊的点是「二叉搜索树」的中序遍历的结果是【有序序列】故而我们可以对「前序遍历」的结果 【排序】 得到「中序遍历」的结果。从而依据这棵树的前序和中序遍历结果构建该「二叉搜索树」。解题思路二二分查找左右子树的分界线递归构建左右子树。可以找到的规律是前序遍历结果第一个是根节点而后面的元素可以分为两个连续的数组一个数组所有元素严格小于根节点另一个数组所有元素严格大于根节点。困难在于快速找到这两个数组的分界线这里用的是二分法。解题思路三根据数值上下界递归构建左右子树我们使用递归的方法在扫描先序遍历的同时构造出二叉树。我们在递归时维护一个 (lower, upper) 二元组表示当前位置可以插入的节点的值的上下界。如果此时先序遍历位置的值处于上下界中就将这个值作为新的节点插入到当前位置并递归地处理当前位置的左右孩子的两个位置。否则回溯到当前位置的父节点。解题思路四单调栈思路是维护一个栈顶小栈顶大的单调栈遍历一遍前序遍历结果。如果当前元素大于栈顶元素则循环出栈找到其父节点node。如果父节点的元素值小于子节点的元素值则子节点为右孩子否则为左孩子。代码逻辑其实很简单。 题目描述 给定一个整数数组它表示BST(即 二叉搜索树 )的 先序遍历 构造树并返回其根。 保证 对于给定的测试用例总是有可能找到具有给定需求的二叉搜索树。 二叉搜索树 是一棵二叉树其中每个节点 Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val。 二叉树的 前序遍历 首先显示节点的值然后遍历Node.left最后遍历Node.right。 示例 1 输入preorder [8,5,1,7,10,12] 输出[8,5,10,1,7,null,12] 示例 2: 输入: preorder [1,3] 输出: [1,null,3] 提示 1 preorder.length 100 1 preorder[i] 10^8 preorder 中的值 互不相同 解题思路一题目大致意思就是给定一个二叉树的前序遍历求对应的二叉搜索树。一种比较特殊的点是「二叉搜索树」的中序遍历的结果是【有序序列】故而我们可以对「前序遍历」的结果 【排序】 得到「中序遍历」的结果。从而依据这棵树的前序和中序遍历结果构建该「二叉搜索树」。 对应的题目是105. 从前序与中序遍历序列构造二叉树感兴趣的可以看看。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def bstFromPreorder(self, preorder: List[int]) - Optional[TreeNode]:inorder sorted(preorder)def myBST(preorder_left: int, preorder_right: int, inorder_left: int, inorder_right: int):if preorder_left preorder_right:return None# 前序遍历中的第一个节点就是根节点preorder_root preorder_left# 在中序遍历中定位根节点inorder_root index[preorder[preorder_root]]# 先把根节点建立出来root TreeNode(preorder[preorder_root])# 得到左子树中的节点数目size_left_subtree inorder_root - inorder_left# 递归地构造左子树并连接到根节点# 先序遍历中「从 左边界1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root.left myBST(preorder_left 1, preorder_left size_left_subtree, inorder_left, inorder_root - 1)# 递归地构造右子树并连接到根节点# 先序遍历中「从 左边界1左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位1 到 右边界」的元素root.right myBST(preorder_left 1 size_left_subtree, preorder_right, inorder_root 1, inorder_right)return rootn len(preorder)index {element: i for i, element in enumerate(inorder)}return myBST(0, n-1, 0, n-1)构造哈希表的目的是为了O(1)时间找到中序遍历结果中的根节点。 时间复杂度O(nlogn)排序的结果构造二叉搜索树的时间复杂度为 O(n) 空间复杂度O(n) 解题思路二二分查找左右子树的分界线递归构建左右子树。可以找到的规律是前序遍历结果第一个是根节点而后面的元素可以分为两个连续的数组一个数组所有元素严格小于根节点另一个数组所有元素严格大于根节点。困难在于快速找到这两个数组的分界线这里用的是二分法。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def bstFromPreorder(self, preorder: List[int]) - Optional[TreeNode]:def dfs(preorder: List[int], left: int, right: int):if left right: return Noneroot TreeNode(preorder[left])if left right: return rootl, r left, rightwhile(l r):mid int(l (r - l 1) / 2)if preorder[mid] preorder[left]: l mid # 转到区间[mid, r]else : r mid -1 # 转到区间[l, mid -1]# 其实最后lr是最终的分界线root.left dfs(preorder, left 1, l)root.right dfs(preorder, l 1, right)return rootn len(preorder)if n0: return nullreturn dfs(preorder, 0, n-1)时间复杂度O(nlogn)在找左右子树分界线的时候时间复杂度为O(logn) 空间复杂度O(n) 解题思路三根据数值上下界递归构建左右子树我们使用递归的方法在扫描先序遍历的同时构造出二叉树。我们在递归时维护一个 (lower, upper) 二元组表示当前位置可以插入的节点的值的上下界。如果此时先序遍历位置的值处于上下界中就将这个值作为新的节点插入到当前位置并递归地处理当前位置的左右孩子的两个位置。否则回溯到当前位置的父节点。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def bstFromPreorder(self, preorder: List[int]) - Optional[TreeNode]:n len(preorder)index 0def dfs(lowerBound: int, upperBound: int):nonlocal index # 将index声明为非局部变量if index n: return Nonecur preorder[index]if cur lowerBound or cur upperBound: return Noneindex 1root TreeNode(cur)root.left dfs(lowerBound, cur)root.right dfs(cur, upperBound)return rootif n0: return nullreturn dfs(float(-inf), float(inf))时间复杂度O(n) 空间复杂度O(n) 解题思路四单调栈思路是维护一个栈顶小栈顶大的单调栈遍历一遍前序遍历结果。如果当前元素大于栈顶元素则循环出栈找到其父节点node。如果父节点的元素值小于子节点的元素值则子节点为右孩子否则为左孩子。代码逻辑其实很简单。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def bstFromPreorder(self, preorder: List[int]) - Optional[TreeNode]:n len(preorder)if n0: return nullroot TreeNode(preorder[0])stack [root]for i in range(1,n,1):node stack[-1]currentNode TreeNode(preorder[i])while stack and stack[-1].val currentNode.val: node stack.pop()if node.val currentNode.val: node.right currentNodeelse : node.left currentNodestack.append(currentNode)return root时间复杂度O(n)仅扫描前序遍历一次。 空间复杂度O(n)用来存储栈和二叉树。
http://www.zqtcl.cn/news/873077/

相关文章:

  • 怎么选择优秀的网站建设公司建设银行宁波分行 招聘网站
  • 工艺品网站模板下载-古色古香建站软件排名
  • 微视频网站源码网站建设目标个人博客dw
  • 山西省建设厅入晋备案网站洛阳网站在哪备案
  • 可以做物理试验的网站有哪些仿微博网站模板
  • 网站横幅怎做网站到期不想续费
  • 黑龙江网站备案管理局济南网站建设策划
  • 网站怎么静态化网页设计与制作图片显示不出来
  • 市场营销推广策划方案网站如何做标题优化
  • 怎么让客户做网站手机网站如何优化
  • 柳州市住房和城乡建设局网站首页赣州章贡区人口
  • 有偷菜餐厅城市建设的网站好的手机网站
  • 做进行网站推广赚钱互联网企业信息服务平台
  • 微信公众号做视频网站吗百度账号登录入口网页版
  • 北京建设银行纪念钞预定官方网站撤销网站备案申请书
  • 网站平台策划书安丘市建设局网站
  • 图片类网站建设seol英文啥意思
  • 网站编辑工作好做吗WordPress的图片存在哪
  • 你的网站尚未进行备案为什么网站百度搜不到了
  • 沙洋网站开发网站建设方案免费
  • iis建设网站教程单页面推广网站
  • 东莞网站建设效果郑州企业自助建站系统
  • php做的购物网站系统下载宜州做网站需要多少钱
  • 昆明网上商城网站建设怎么做网站教程视频
  • 网站开发都需要什么移动公司网络维护待遇
  • 计算机网络技术网站建设方向wordpress虚拟货币
  • 小江网站建设公司紧急页面通知升级中访问大通知
  • 那个公司做的网站详情页好看做动态图片的网站吗
  • 旅游网站模板文章wordpress 删除
  • 沛县专业做网站wordpress id重置密码