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

(没思路,典型记住思路好做)

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

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

例如,给出

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

返回如下的二叉树:

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7

链接:https://www.nowcoder.com/questionTerminal/0ee054a8767c4a6c96ddab65e08688f4
来源:牛客网

  1. /*
  2.      * 假设树的先序遍历是12453687,中序遍历是42516837。
  3.      * 这里最重要的一点就是先序遍历可以提供根的所在,
  4.      * 而根据中序遍历的性质知道根的所在就可以将序列分为左右子树。
  5.      * 比如上述例子,我们知道1是根,所以根据中序遍历的结果425是左子树,而6837就是右子树。
  6.      * 接下来根据切出来的左右子树的长度又可以在先序便利中确定左右子树对应的子序列
  7.      * (先序遍历也是先左子树后右子树)。
  8.      * 根据这个流程,左子树的先序遍历和中序遍历分别是245和425,
  9.      * 右子树的先序遍历和中序遍历则是3687和6837,我们重复以上方法,可以继续找到根和左右子树,
  10.      * 直到剩下一个元素。
  11.      */
  12.     public TreeNode buildTree(int[] preorder, int[] inorder) {
  13.         return buildTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
  14.     }
  15.  
  16.     private TreeNode buildTree(int[] preorder, int preLeft, int preRight, int[] inorder, int inLeft, int inRight) {
  17.         if(preRight<preLeft)
  18.             return null;
  19.         TreeNode node=new TreeNode(preorder[preLeft]);
  20.         if(preRight==preLeft)
  21.             return node;
  22.         int num=0;
  23.         for(int i=inLeft;i<=inRight;i++){
  24.             if(inorder[i]==preorder[preLeft]){
  25.                 num=i;
  26.                 break;
  27.             }
  28.         }
  29.         int length=num-inLeft;
  30.          
  31.         node.left=buildTree(preorder,preLeft+1,preLeft+length,inorder,inLeft,inLeft+length-1);
  32.         node.right=buildTree(preorder,preLeft+length+1,preRight,inorder,num+1,inRight);
  33.          
  34.         return node;
  35.     }

看了答案自己写,边界条件老是搞错:

  1. public class ConstructBinaryTree {
  2. public TreeNode buildTree(int[] preorder, int[] inorder) {
  3. if (preorder.length <=0 || inorder.length<=0){
  4. return null;
  5. }
  6. return helper(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
  7.  
  8. }
  9.  
  10. public TreeNode helper(int[] preorder,int i,int j, int[] inorder,int m,int n) {
  11. if (i>j) {
  12. return null;
  13. }
  14. int root = preorder[i];
  15. TreeNode node = new TreeNode(root);
  16. int leftlength = 0;
  17. for (int k=m;k<=n;k++) {
  18. if (root == inorder[k]) {
  19. leftlength = k-m;
  20. }
  21. }
  22. node.left = helper(preorder, i+1, i+leftlength,inorder, m, m+leftlength-1);
  23. node.right = helper(preorder, i+leftlength+1, j,inorder, m+leftlength+1, n);
  24. return node;
  25. }
  26. }

106. 从中序与后序遍历序列构造二叉树

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

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

例如,给出

  1. 中序遍历 inorder = [9,3,15,20,7]
  2. 后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

  1. 3
  2. / \
  3. 9 20
  4. / \
  5. 15 7
  6.  
  7. 105从前序与中序遍历序列构造二叉树的区别就是后序序列最后一个是根节点,其他一样

【2】【leetcode-105,106】 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树的更多相关文章

  1. leetcode 105 106 从前序与中序遍历序列构造二叉树 从中序与后序遍历序列构造二叉树

    题目: 105 根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  2. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  3. [Java]算术表达式组建二叉树,再由二叉树得到算式的后序和中序表达式

    Entry类: package com.hy; import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  4. Leetcode(105)-从前序与中序遍历序列构造二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15, ...

  5. 已知树的前序、中序,求后序的c++实现&已知树的后序、中序,求前序的c++实现

    #include"iostream" using namespace std; int pre[30]; int in[30]; int post[30]; int indexOf ...

  6. 【LeetCode】105 & 106. Construct Binary Tree from Inorder and Postorder Traversal

    题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume ...

  7. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  8. Leetcode 106. 从中序与后序遍历序列构造二叉树

    题目链接 https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/descri ...

  9. 树的三种DFS策略(前序、中序、后序)遍历

    之前刷leetcode的时候,知道求排列组合都需要深度优先搜索(DFS), 那么前序.中序.后序遍历是什么鬼,一直傻傻的分不清楚.直到后来才知道,原来它们只是DFS的三种不同策略. N = Node( ...

随机推荐

  1. 在VS中安装nuget离线包nupkg文件

    1.下载 nupkg文件 2.打开VS,工具,选项,如下图,复制右侧圈圈地址,把下载文件复制丢进去 3.管理当前解决方案的nuget包 n 4.左侧选择你下载的包名,在右侧选择需要安装在哪一层项目,点 ...

  2. 【BZOJ3165】[HEOI2013]Segment(李超线段树)

    [BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...

  3. 【BZOJ5294】[BJOI2018]二进制(线段树)

    [BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...

  4. rt-thread中软件定时器组件超时界限的一点理解

    @2019-01-15 [小记] 对 rt-thread 中的软件定时器组件中超时界限的一点理解 rt_thread_timer_entry(void *parameter)函数中if ((next_ ...

  5. bzoj1497 最大获利(最大权闭合子图)

    题目链接 思路 对于每个中转站向\(T\)连一条权值为建这个中转站代价的边.割掉这条边表示会建这个中转站. 对于每个人向他的两个中转站连一条权值为\(INF\)的边.然后从\(S\)向这个人连一条权值 ...

  6. Linux由浅入深学习 (转)

    转自 => 作者:Vamei 出处:http://www.cnblogs.com/vamei 走进Linux 我从这一部分开始走入Linux.Raspbian是Linux的一个发行版本,而Lin ...

  7. 第五篇 - Selenium突破反爬获取qq邮件标题

    from selenium import webdriver from selenium.webdriver import ActionChains #1.打开登陆页面 wd = webdriver. ...

  8. pytest 5. fixture之yield实现teardown

    前言: 1.前面讲的是在用例前加前置条件,相当于setup,既然有setup那就有teardown,fixture里面的teardown用yield来唤醒teardown的执行 看以下的代码: #!/ ...

  9. Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题

    Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题 以前是正常的,后来在 server.xml 文件的 <Host> </Host> ...

  10. Going Home POJ - 2195 (最小费用最大流)

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...