面试题 6: 重建二叉树
2017-07-02 09:31
337 查看
一. 题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序编列序列{4,7,2,1,5,3,8,6},则重建出图所示的二叉树并输出它的头结点.
代码请到我的代码库中下载 Point2Offer
二. 代码
有不妥当之处,麻烦告知:D
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序编列序列{4,7,2,1,5,3,8,6},则重建出图所示的二叉树并输出它的头结点.
代码请到我的代码库中下载 Point2Offer
二. 代码
package week_3; /**难度系数:**** * 剑指offer: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二节树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 方法:递归 * 测试用例:功能测试(树的五种情况) * @author dingding * Date:2017-7-1 19:00 * Declaration: All Rights Reserved! */ public class No6 { public static void main(String[] args) { test1(); System.out.println(); test2(); System.out.println(); test3(); System.out.println(); test4(); System.out.println(); test5(); System.out.println(); test6(); System.out.println(); test7(); } //构造二叉树 private static BinaryTreeNode construct(int[] preorder,int[] inorder){ if (preorder == null || inorder == null || preorder.length!=inorder.length || inorder.length <1) { return null; } return constructCore(preorder, 0,preorder.length-1,inorder,0,inorder.length-1); } //核心代码 private static BinaryTreeNode constructCore(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) { if (preStart>preEnd) { return null; } int value = preorder[preStart]; int index = inStart; //在中序遍历的数组中找根节点的位置 while (index <=inEnd && inorder[index]!=value){ index++; } if (index >inEnd) { throw new RuntimeException("Invalid input."); } //创建当前的根节点,并且为节点赋值 BinaryTreeNode node = new BinaryTreeNode(value); node.left = constructCore(preorder, preStart+1, preStart+index-inStart, inorder, inStart, index-1); node.right = constructCore(preorder, preStart+index-inStart+1, preEnd, inorder, index+1, inEnd); return node; } //重建后二叉树以前序遍历的方式输出 private static void printTree(BinaryTreeNode root){ if (root!=null) { System.out.print(root.value+" "); printTree(root.left); printTree(root.right); } } /*====================测试用例=================*/ private static void test1() { int[] preorder = {1, 2, 4, 7, 3, 5, 6, 8}; int[] inorder = {4, 7, 2, 1, 5, 3, 8, 6}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } private static void test2() { int[] preorder = {1, 2, 3, 4, 5}; int[] inorder = {5, 4, 3, 2, 1}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } private static void test3() { int[] preorder = {1, 2, 3, 4, 5}; int[] inorder = {1, 2, 3, 4, 5}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } private static void test4() { int[] preorder = {1}; int[] inorder = {1}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } private static void test5() { int[] preorder = {1, 2, 4, 5, 3, 6, 7}; int[] inorder = {4, 2, 5, 1, 6, 3, 7}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } private static void test6() { construct(null, null); } private static void test7() { int[] preorder = {1, 2, 4, 5, 3, 6, 7}; int[] inorder = {4, 2, 8, 1, 6, 3, 7}; BinaryTreeNode root = construct(preorder, inorder); printTree(root); } } //定义一个树 class BinaryTreeNode{ int value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int value) { this.value = value; this.left = null; this.right = null; } }
有不妥当之处,麻烦告知:D
相关文章推荐
- 《剑指offer》面试题6:重建二叉树
- 面试题5:重建二叉树
- 面试题7:重建二叉树(offer)
- 【剑指offer Java】面试题6:重建二叉树
- 剑指offer面试题6:重建二叉树(Java实现)
- 剑指Offer_面试题06_重建二叉树
- 剑指offer--面试题6 重建二叉树
- 剑指offer面试题06 重建二叉树
- 面试题6:重建二叉树
- 剑指offer面试题6:重建二叉树
- 面试题6- 重建二叉树
- 剑指offer-面试题6-重建二叉树
- 剑指Offer:面试题6——重建二叉树(java实现)
- 剑指offer - 面试题6:重建二叉树
- 二叉树面试题(一) 重建二叉树
- 前端常见算法面试题之 - 重建二叉树[JavaScript解法]
- 剑指offer 面试题6—重建二叉树
- 面试题6 重建二叉树
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)