题目链接:http://ac.jobdu.com/problem.php?cid=1039&pid=1

题目描述:

题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。输入:
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。
输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。
输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。输出:
对应每个测试案例,输出一行:
如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。
如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。样例输入:
8
1 2 4 7 3 5 6 8
4 7 2 1 5 3 8 6
8
1 2 4 7 3 5 6 8
4 1 2 7 5 3 8 6
样例输出:
7 4 2 5 8 6 3 1
No

参考网址:http://zephiruswt.blog.51cto.com/5193151/885951

Java代码,测试通过,但是OJ测试,Runtime Error

import java.util.Scanner;/*** 题目二:重建二叉树* * @author yinger*/
public class NineOj_t2 {static int count = 0;public static void main(String[] args) {Scanner cin = new Scanner(System.in);int n;while (cin.hasNextInt()) {count =0;n = cin.nextInt();int[] pre = new int[n];int[] ino = new int[n];for (int i = 0; i < n; i++) {pre[i] = cin.nextInt();}for (int i = 0; i < n; i++) {ino[i] = cin.nextInt();}Node root = new Node(pre[0]);// 二叉树的根节buildTree(root, pre, 0, n - 1, ino, 0, n - 1);StringBuffer buffer = new StringBuffer();postOrder(root,buffer);// 后序遍历if (count == n) {//肯定只会append n次,如果不是,那么二叉树是错误的System.out.println(buffer.toString());}else{System.out.println("No");}
//            if (buildTree(root, pre, 0, n - 1, ino, 0, n - 1)) {// 重建二叉树
//                postOrder(root);// 后序遍历
//            } else {// 不存在这样的二叉树
//                System.out.println("No");
//            }
        }}// 后序遍历二叉树private static void postOrder(Node root, StringBuffer buffer) {if (root == null) {return;}postOrder(root.left, buffer);postOrder(root.right, buffer);visit(root,buffer);}private static void visit(Node root, StringBuffer buffer) {
//        System.out.print(root.value + " ");buffer.append(root.value+" ");count ++;}// 构建二叉树private static void buildTree(Node root, int[] pre, int pre_start, int pre_end, int[] ino, int ino_start,int ino_end) {if (pre_start > pre_end || pre_end > pre.length) {// pre起点和终点的索引错了,或者超出了范围return;}
//        if (pre_start == pre_end && ino_start == ino_end) {// 在只有一个元素的时候要检查数字是否相同!不同的话就不能构成二叉树
//            return pre[pre_start] == ino[ino_start];
//        }// boolean flag_left = true,flag_right=true;sint index = findRootIndex(ino, root.value);// 查找root在ino中的索引int len_left = index - ino_start;// root的左子树的长度int len_right = ino_end - index;// root的右子树的长度if (len_left > 0) {// 存在左子树Node leftRoot = new Node(pre[pre_start + 1]);// 左根节点root.left = leftRoot;/* flag_left = */buildTree(leftRoot, pre, pre_start + 1, pre_start + len_left - 1, ino, ino_start,index - 1);}// if (!flag_left) {//如果左边的子树出现了问题,那么就返回false,表示二叉树不存在// return false;// }if (len_right > 0) {// 存在右子树Node rightRoot = new Node(pre[pre_start + len_left + 1]);// 右根节点root.right = rightRoot;/* flag_right = */buildTree(rightRoot, pre, pre_start + len_left + 1, pre_start + len_left + len_right - 1,ino, index + 1, ino_end);}
//        return flag_right;
    }// 在中序序列中查找根节点的索引private static int findRootIndex(int[] ino, int value) {for (int i = 0; i < ino.length; i++) {if (ino[i] == value) {return i;}}return -1;}
}class Node {int value;Node left;Node right;public Node(int value) {this.value = value;}}

【剑指Offer】面试招聘题目2:重建二叉树相关推荐

  1. 剑指offer——面试题6:重建二叉树

    剑指offer--面试题6:重建二叉树 一个小知识点:已知二叉树的中序遍历和前序遍历(或后序遍历)结果则可以确定该二叉树:但是通过二叉树的前序遍历和后序遍历结果无法确定该二叉树!!! Solution ...

  2. C++版-剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告

    剑指offer 重建二叉树 提交网址:  http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&t ...

  3. 剑指offer:面试题07. 重建二叉树

    题目: 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...

  4. 剑指offer——面试题7:重建二叉树

    1 // 面试题7:重建二叉树 2 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输 3 // 入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1, ...

  5. 剑指Offer(Java实现)重建二叉树

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  6. 牛客网(剑指offer) 第四题 重建二叉树

    //题目描述 //输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. //例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历 ...

  7. 《剑指offer》c++版本 7.重建二叉树

    如题: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和 中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序 遍历序列{4,7 ...

  8. 剑指offer面试题6:重建二叉树

    1.题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. public class Solution {public TreeNode reConstructBinaryTree(int ...

  9. 剑指offer 面试题6:重建二叉树

    题目 输入某二叉树的前序遍历和中序遍历,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含有重复的数字. 例如,前序遍历序列:{1,2,3,7,3,5,6,8},中序遍历序列:{4,7,2, ...

  10. 【剑指offer】面试题07. 重建二叉树(Java)

    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ino ...

最新文章

  1. 2018全球大学AI排名:清华位列亚洲大学综合排名首位
  2. 转载:概率与梳理统计||数学基础
  3. wxWidgets:wxCheckListBox类用法
  4. 从按下电源开关到bash提示符
  5. ActiveMQ持久化到mysql
  6. Flex itemReanderer(转)
  7. 全国计算机等级考试题库二级C操作题100套(第50套)
  8. Java行为参数化(一)
  9. 这样用Docker 搭建 Jenkins 实现自动部署,你知道吗?
  10. 如何使用JavaScript检查输入是否为空
  11. Spring --getBean用法
  12. 数据源管理 | Kafka集群环境搭建,消息存储机制详解
  13. java 房贷计算器_求一房贷计算器java源程序
  14. 437.路径总和III (力扣leetcode) 博主可答疑该问题
  15. 硅谷谍战: Menlo Park某VC是CIA开的, 你们公司实习生可能是科技间谍…
  16. java servlet试题_JAVA servlet 面试题
  17. steam游戏图标失效_如何将非Steam游戏添加到Steam并应用自定义图标
  18. dht11温湿度传感器工作原理引脚功能电路接线图
  19. AI资源对接需求汇总: 第4期
  20. html向下的箭头符号,向下的箭头符号

热门文章

  1. Django-View中绕过RSCF验证
  2. 【转载】Eclipse 最常用快捷键 (动画讲解),最简单的一些快捷键
  3. python --time()函数
  4. STL的pair学习, map学习
  5. BIOS设置和CMOS设置的区别和联系
  6. POJ 2870 求矩阵的加法
  7. 准备把以前在百毒博客写的一些文章搬运过来
  8. SQL Server中EXISTS结构
  9. python数据分析张俊红_关于数据分析我们来聊聊Python
  10. jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境