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

专业建设外贸网站制作江门嘉兴信息网站

专业建设外贸网站制作江门,嘉兴信息网站,晋城网站建设价格,wordpress支持视频播放器插件下载105:从前序与中序遍历序列构造二叉树 啊,好久都没有更新算法题目了。曾今是C,如今是Java,感慨啊。 像树这样的算法题,基本都逃不开递归。递归的思想是:将大任务拆分为小任务。我们不妨构建一个函数&#…

105:从前序与中序遍历序列构造二叉树

啊,好久都没有更新算法题目了。曾今是C++,如今是Java,感慨啊。

像树这样的算法题,基本都逃不开递归。递归的思想是:将大任务拆分为小任务。我们不妨构建一个函数,取名func1(),它实现的功能是:在指定区间内, 找到并构建root节点并返回

如果我们想要构建一棵树,只需要调用func1(),就能够得到树的根节点,那么树的构建过程就可以简化为如下形式:

TreeNode root = new TreeNode();
root.value = value;
root.left = func1(...);
root.right = func1(...)'

通过func1,我们即可计算得到左右节点,具体的逻辑都一样

现在,让我们将视角聚焦于如何构建func1()。函数内容的核心是:构建root节点。构建分为三步: 1.得到root.val,构建root.left,构建root.right。为了解决这个内容,我们先将 前序遍历中序遍历写为以下形式

前序 : 【root,(左子树),(右子树)】
中序 : 【(左子树),root,(右子树)】

如果我们想要确定root节点,我们只需要在前序数组中,获取第一个元素即可。如果我们想要确定左子树长度,右子树长度,我们只需要知道中序中,root节点的index即可

我们假设前序数组的区间范围是: [ l 1 , r 1 ] [ l1, r1 ] [l1,r1]中序是: [ l 2 , r 2 ] [l2, r2] [l2,r2]。root节点在中序的下标是 r o o t I d x I n rootIdxIn rootIdxIn,那么左子树长度 l e f L e n = r o o t I n d I n − l 2 lefLen = rootIndIn - l2 lefLen=rootIndInl2右子树长度 r i g L e n = r 2 − r o o t I n d I n rigLen = r2 - rootIndIn rigLen=r2rootIndIn

rootValue很好获取,前序[l1]。
root.left的获取,我们可以交给递归函数完成。因为root.left,其本质是左子树的root节点,规定func1的计算范围是root节点的左子树范围即可完成计算;
root.right同理。

tip : 笔者习惯将递归函数命名为dfs,但这不是真正的dfs

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public HashMap<Integer, Integer> map = new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {int n = preorder.length;// 通过map映射 值-index的方式, 加速root节点在中序数组下标的定位速度for (int i = 0; i < inorder.length; ++i) {map.put(inorder[i], i);}return dfs(preorder, inorder, 0, n - 1, 0, n - 1);}public TreeNode dfs(int[] preorder, int[] inorder, int l1, int r1, int l2, int r2) {// 递归终止条件, 如果l1 > r1, 表明当区间不存在, 节点值应该赋为nullif (l1 > r1 || l2 > r2) return null;// debugSystem.out.println("l1 = " + l1 + " r1 = " + r1 + " l2 = " + l2 + " r2 = " + r2);// 确定根节点int rootVal = preorder[l1];// 根节点再inorder中的indexint rootIdxIn = map.get(rootVal);System.out.println("rootIdxIn = " + rootIdxIn);// 左区间长度int lefLen = rootIdxIn - l2;// 右区间长度int rigLen = r2 - rootIdxIn;TreeNode root = new TreeNode();root.val = rootVal;root.left = dfs(preorder, inorder, l1 + 1, l1 + lefLen, l2, rootIdxIn - 1);root.right = dfs(preorder, inorder, l1 + lefLen + 1, r1, rootIdxIn + 1, r2);return root;}
}
http://www.yayakq.cn/news/996302/

相关文章:

  • 新乡网站建设多少钱wordpress 多站点建站教程
  • 自适应网站 响应式网站模板建设银行投诉处理网站
  • 深圳网站建设公司团队承德网站建设公司
  • 怎么在国外网站赚钱网站建设 职位
  • 企业网站推广方法有哪些微信公众账号申请注册
  • 庆阳定制网站wordpress 导入幻灯片
  • wordpress主题导出网站优化北京seo
  • 做网站怎么套模板wordpress外观自定义
  • 网站建设 山东做购物网站需不需要交税费
  • 服装移动网站策划案网页开发流程是什么
  • dede手机网站建设教程唐山网站建设互众动力
  • 黄页网页的推广网站下载特色的武进网站建设
  • 怎么上传网站图片的链接现在怎么做网络推广
  • 襄阳哪里有做网站的WordPress更换域名权重
  • 张家港市做网站的公司网站 售后服务
  • 怎么在百度上建立网站企业展厅设计公司哪家好怎么样
  • 温州网站改版四川成都新冠最新消息
  • 如可做网站自助申请海外网站
  • 网站设计编程微信移动网站建设
  • 中国建设银行网站密码忘了怎么办安阳网络教研平台登录
  • 鲜花商城网站设计寿光营销型网站建设
  • 网站改版会影响收录吗做企业内刊有哪些网站推荐
  • 深圳做分销网站公司南宁网络推广平台
  • 周期购那个网站做的比较好wordpress my vistors
  • wordpress多个网站网站建设排名的公司哪家好
  • 保亭住房和城乡建设局网站深圳网站建设计
  • 如何建立自己个人网站淘宝运营培训教程
  • 创建网站多少钱软件开发在大学属于什么专业
  • 酒泉网站seo谷歌关键词搜索量数据查询
  • 网站建设 工业 青岛外贸营销型网站2018