二叉树重建

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

package com.huawei;

import java.util.Scanner;

class Node {
Node left = null;
Node right = null;
int value;
int size;
}
public class BinaryTreeBuilder {
/**
* 根据前序遍历和中序遍历重建二叉树子树
* @param preOrder 前序遍历数组
* @param start 子树起始位置
* @param inOrder 中序遍历数组
* @param end 中序遍历结束位置
* @param length 子树节点树
* @return 子树的根节点
*/
public static Node buildTree(char[] preOrder, int start,
char[] inOrder, int end, int length) {
//参数验证
if (preOrder == null || preOrder.length == 0 || inOrder == null
|| inOrder.length == 0 || length <= 0) {
return null;
}

//建立子树根节点
char value = preOrder[start];
Node root = new Node();
root.value = value;

//递归终止条件:子树只有一个节点
if (length == 1)
return root;

//分拆子树的左子树和右子树
int i = 0;
while (i < length) {
if (value == inOrder[end - i]) {
break;
}
i++;
}

//建立子树的左子树
root.left = buildTree(preOrder, start + 1, inOrder, end - i - 1, length - 1 - i);
//建立子树的右子树
root.right = buildTree(preOrder, start + length - i, inOrder, end, i );

return root;
}
public static void getTree(Node root){
if(root == null){
System.out.println("No");
return;
}
if(root.left != null){
getTree(root.left);
}
if(root.right != null){
getTree(root.right);
}
System.out.print(root.value + " ");
}

public static Node rebuild(int[] preOrder, int startPre, int endPre, int[] inOrder, int startIn, int endIn){

if(endPre - startPre != endIn - startIn){
return null;
}

if(startPre > endPre){
return null;
}

Node root = new Node();
root.value = preOrder[startPre];
root.size = 1;
root.left = null;
root.right = null;

if(startPre == endPre){
return root;
}

int index, length;
for(index=startIn; index<=endIn; index++){
if(inOrder[index] == preOrder[startPre]){
break;
}
}

if(index > endIn){
return null;
}

if(index > startIn){
length = index - startIn;
root.left = rebuild(preOrder, startPre+1, startPre+length, inOrder, startIn, startIn+length-1);
if(root.left != null)
root.size += root.left.size;
}
if(index < endIn){
length = endIn - index;
root.right = rebuild(preOrder, endPre-length+1, endPre, inOrder, endIn-length+1, endIn);
if(root.right != null)
root.size += root.right.size;
}
return root;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
int[] preOrder = new int[n]; //{'1', '2', '4', '7', '3', '5', '6', '8'};
int[] inOrder = new int[n]; //{'4', '7', '2', '1', '5', '3', '8', '6'};
//    String preStr = sc.next();
//    System.out.println(preStr.length());
//    String inStr = sc.nextLine();
for(int i=0; i<n; i++){
preOrder[i] = sc.nextInt();//.charAt(0);
//    inOrder[i] = inStr.charAt(i);
}
for(int i=0; i<n; i++){
//    preOrder[i] = sc.next().charAt(0);
inOrder[i] = sc.nextInt();//.charAt(0);
}
Node root = rebuild(preOrder,0,n-1,inOrder,0,n-1);//buildTree(preOrder, 0, inOrder, inOrder.length - 1, inOrder.length);
if(root.size == n)
getTree(root);
else{
System.out.println("No");
}
System.out.println();
}
sc.close();
}
}
原文地址:https://www.cnblogs.com/woniu4/p/4625487.html