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

厦门优秀的网站设计/制作网页多少钱

厦门优秀的网站设计,制作网页多少钱,天河企业网站建设,有没有淄博张店做兼职工作的网站题目 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 题目分析 根据一棵树的前序遍历…

题目

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3/ \9  20/  \15   7

题目分析

根据一棵树的前序遍历和中序遍历情况画出该树,是离散数学和数据结构课程中都讲过的内容。前序遍历的顺序是:根->左子树->右子树。而中序遍历的顺序是:左子树->根->右子树。因此,我们先看中序遍历的情况,比如第一个元素是3,这就是根,而它的左子树和右子树的情况可以看中序遍历的情况,以3为分界,左侧的值即为左子树,右侧的值即为右子树。那么怎么确认子树的根节点是哪一个呢?这个也很简单,比如我们看3的右子树,在前序遍历中,{15,20,7}中最先出现的是20,因此20就是右子树的根节点,即root.right为20。掌握了这个方法,我们就可以通过递归的思路解决这个问题。

代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode root;public int findIndex(int[] array, int target) {for (int i = 0; i < array.length; i++) {if (target == array[i])return i;}return -1;}public boolean contains(int[] array, int target) {for (int i = 0; i < array.length; i++) {if (target == array[i])return true;}return false;}public void buildTree(TreeNode root, int[] curArray, int[] preorder) {int index = findIndex(curArray, root.val);int[] leftArray = Arrays.copyOfRange(curArray, 0, index);int[] rightArray = Arrays.copyOfRange(curArray, index + 1, curArray.length);TreeNode leftNode = null;TreeNode rightNode = null;if (leftArray.length > 0) {for (int i : preorder) {if (contains(leftArray, i)) {leftNode = new TreeNode(i);break;}}root.left = leftNode;buildTree(leftNode, leftArray, preorder);}if (rightArray.length > 0) {for (int i : preorder) {if (contains(rightArray, i)) {rightNode = new TreeNode(i);break;}}root.right = rightNode;buildTree(rightNode, rightArray, preorder);}}public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length==0)return null;root = new TreeNode(preorder[0]);buildTree(root, inorder, preorder);return root;}
}

这个代码跑了2000多ms,效率极低,我们对其做一个小小的优化。在上述代码中,寻找某一棵子树最先出现的节点的时候,始终使用的是原先的前序遍历的数组。事实上,一旦确定了某个根节点,这个根节点之后是绝对不会再使用了,因此我们可以使用arraylist存储,不断删除这些已经确定的根节点,从而提高效率。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode root;public int findIndex(int[] array, int target) {for (int i = 0; i < array.length; i++) {if (target == array[i])return i;}return -1;}public boolean contains(int[] array, int target) {for (int i = 0; i < array.length; i++) {if (target == array[i])return true;}return false;}public void buildTree(TreeNode root, int[] curArray, ArrayList<Integer> preorder) {int index = findIndex(curArray, root.val);int[] leftArray = Arrays.copyOfRange(curArray, 0, index);int[] rightArray = Arrays.copyOfRange(curArray, index + 1, curArray.length);TreeNode leftNode = null;TreeNode rightNode = null;if (leftArray.length > 0) {for (int i : preorder) {if (contains(leftArray, i)) {leftNode = new TreeNode(i);break;}}root.left = leftNode;preorder.remove(preorder.indexOf(leftNode.val));buildTree(leftNode, leftArray, preorder);}if (rightArray.length > 0) {for (int i : preorder) {if (contains(rightArray, i)) {rightNode = new TreeNode(i);break;}}root.right = rightNode;preorder.remove(preorder.indexOf(rightNode.val));buildTree(rightNode, rightArray, preorder);}}public TreeNode buildTree(int[] preorder, int[] inorder) {ArrayList<Integer> pre = new ArrayList<Integer>();for(int i:preorder)pre.add(i);if(preorder.length==0)return null;root = new TreeNode(preorder[0]);buildTree(root, inorder, pre);return root;}
}

优化后的代码运行完毕仅需要27ms,这说明我们要时时刻刻注意代码的优化,有时候几行的优化可能会代码效率百倍计的提升。

http://www.lbrq.cn/news/1260775.html

相关文章:

  • 齐家网装修公司地址/谷歌seo优化
  • 做网站建设的工资高吗/seo排名优化软件价格
  • 无锡企业做网站/网店关键词怎么优化
  • 湛江购房网/网站优化推广哪家好
  • 珠海市企业网站制作平台/网络营销ppt讲解
  • 租空间网站/百度客服联系方式
  • 泉州网站开发人员/深圳高端seo外包公司
  • 做义工的网站/网络营销主要特点有哪些
  • 做铁艺需要什么网站/网站怎么进入
  • 洛阳网站设计哪家专业/推广引流最快的方法
  • 做网站购买备案域名/品牌推广方案包括哪些
  • 熊岳网站在哪做/长沙网络公关公司
  • 网站备案怎么在工信部信息核验/郑州网站
  • 做技术分享网站有哪些/百度怎么做推广和宣传
  • 佛山 做网站公司/网站制作app
  • 企业信用查询平台/二十个优化
  • 视频解析网站怎么做/网络推广哪个好
  • 做网站小程序多少钱/b站推广2023
  • 网站建设模版/技师培训
  • 项链seo关键词/网站seo综合查询
  • 天眼查网站建设公司/网络推广工作好做不
  • 东莞注册公司需要什么资料/seo外链建设方法
  • 做网站为什么要服务器/怎么登录百度app
  • 动态网站系统的5个组成部分/360点睛实效平台推广
  • 专业网站制作公司咨询/北京软件开发公司
  • 长垣网站建设/百度搜索引擎官网入口
  • 安卓app开发工具/苏州网站关键字优化
  • 花店网站建设环境分析/互联网营销师是什么
  • 邢台网站制作公司哪家专业/百度自动驾驶技术
  • 百度外卖网站建设与维护方法/百度大数据中心
  • 力扣面试150题--加一
  • 一起学springAI系列一:流式返回
  • 向量空间模型
  • C++编译过程与GDB调试段错误和死锁问题
  • 标记-清除算法中的可达性判定与Chrome DevTools内存分析实践
  • 集成电路学习:什么是USB HID人机接口设备