Pro 6 重建二叉树(java)

注:(1)java中树的构建

(2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的

 1 package com.xsf.SordForOffer;
 2
 3 import java.util.Arrays;
 4
 5 /*剑指offer第6个问题
 6  根据前序和中序遍历来重建二叉树
 7  */
 8 class BinaryTreeNode {
 9     public int value;
10     public BinaryTreeNode leftNode;
11     public BinaryTreeNode rightNode;
12 }
13
14 class ConstructCore {
15     /*
16      * 输入二叉树的前序遍历和中序遍历结果,重建二叉树并输出头节点 ex:12473568,47215386
17      */
18     public BinaryTreeNode constructCore(int[] preorder, int[] inorder)
19             throws Exception {
20
21         if (preorder == null || inorder == null) {
22             return null;
23         }
24         if (preorder.length != inorder.length) {
25             throw new Exception("长度不一样-非法输入");
26         }
27         BinaryTreeNode root = new BinaryTreeNode();
28         for (int i = 0; i < inorder.length; i++) {
29             if (inorder[i] == preorder[0]) {
30                 // isHave = true;
31                 root.value = inorder[i];
32                 root.leftNode = constructCore(
33                         Arrays.copyOfRange(preorder, 1, i + 1),
34                         Arrays.copyOfRange(inorder, 0, i));
35                 root.rightNode = constructCore(
36                         Arrays.copyOfRange(preorder, i + 1, preorder.length),
37                         Arrays.copyOfRange(inorder, i + 1, inorder.length));
38             }
39         }
40
41         return root;
42     }
43
44     public void lastOrderTraverse(BinaryTreeNode T) {
45         if (T != null) {
46             lastOrderTraverse(T.leftNode);
47             lastOrderTraverse(T.rightNode);
48             System.out.print(T.value);
49         }
50     }
51 }
52
53 public class Pro6Biconstruct {
54     public static void main(String[] args) throws Exception {
55         ConstructCore test = new ConstructCore();
56         int[] pre = { 1, 2, 4 };
57         int[] in = { 2, 1, 4 };
58         BinaryTreeNode root = test.constructCore(pre, in);
59         test.lastOrderTraverse(root);
60     }
61 }
时间: 2024-12-06 21:29:26

Pro 6 重建二叉树(java)的相关文章

Pro 6 重建二叉树

思路: (1)需要了解前序遍历和和中序遍历的特点,前序遍历第一个元素即为根节点,然后再在中序遍历以这个根节点为界限得到宏观上的左子串和右子串,如下图 (2)又可以将截取的子串分为新的子串问题,从而可以通过迭代来解决, (3)构建左子树:主要就是指针的运用,获取前序遍历左子串的起始地址和子串长度,中序遍历左子串起始位置和根节点位置 root->left = ConstructCore(preStart+1,leftPreOrderEnd,  inStart,rootInorder-1); (4)同

04.重建二叉树 (Java)

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路 先根遍历序列pre:1,2,4,7,3,5,6,8 中根遍历序列in:4,7,2,1,5,3,8,6 采用递归 取pre数组中的第一个元素1,则in数组中以根节点元素1为界,左边即为根节点的左子树元素序列,右边即为根节点的右子树元素序列. 即左子

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

重建二叉树-牛客网-剑指offer

1.问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 2.问题分析 2.1首先了解二叉树的结构 2.2了解二叉树的三种遍历顺序(前序遍历,中序遍历和后序遍历) 前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 根据前序遍历序列和中序遍历序列,或后序遍历序列和中序遍历序列,能唯一确定二叉树. 2.3

【数据结构与算法】重建二叉树

只能根据前序中序或者中序后序重建二叉树,不可能根据前序和后序重建,因为需要中序去划分左右子树. 代码实现 /** * 源码名称:ConstructBT.java * 日期:2014-09-05 * 程序功能:重建二叉树(前序中序) * 版权:[email protected] * 作者:A2BGeek */ public class ConstructBT { class Node<T> { T mValue; Node<T> mLeft; Node<T> mRight

HDU 1710-Binary Tree Traversals(重建二叉树)

Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3340    Accepted Submission(s): 1500 Problem Description A binary tree is a finite set of vertices that is either empty or

剑指Offer:重建二叉树【7】

剑指Offer:重建二叉树[7] 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 分析 我们首先要明白前序和中序构建二叉树的流程,流程理解了才是解题的关键: 如上图所示,前序遍历可以找到头结点,然后在中序遍历中找到它的位置 比如,1的位置为i,那么startIn~i-1就是它的左子树的中序遍历,st

面试题:重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 使用递归的方法 import java.util.*; public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { if(pre == nu