您的位置:首页 > Web前端

剑指offer-重建二叉树

2015-09-14 09:12 330 查看
题目描述

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

题目分析

  首先应该弄清楚前序遍历,中序遍历,后序遍历的遍历流程,然后应该明白树的递归定义:要么树为空,要么由根和零个或多个非空子树组成。那么,我们就可以用递归重建一棵二叉树。

import java.util.Arrays;

public class 重建二叉树 {

public static TreeNode reConstructBinaryTree(int[] pre, int[] in) {
//首先找到根节点,前序遍历的第一个数是根节点上面的值
int rootData = pre[0];
TreeNode root = new TreeNode(rootData);// 找到跟节点
// 在中序遍历中找到rootData的位置
int rootinIndex = 0;
int temp = in[rootinIndex];
while (rootinIndex < in.length && rootData != temp) {
rootinIndex++;
temp = in[rootinIndex];
}

if (rootinIndex == in.length && rootData != in[rootinIndex - 1]) {
throw new IllegalArgumentException("invalid input");
}
// 如果有左孩子节点,那么中序遍历的rootData前面的数据都是左孩子节点上的,前序遍历的[1,rootinIndex]都是左孩子节点上的
if (rootinIndex > 0) {
root.left = reConstructBinaryTree(
Arrays.copyOfRange(pre, 1, rootinIndex + 1),
Arrays.copyOfRange(in, 0, rootinIndex));
}
// 如果有右孩子节点,那么中序遍历rootinIndex到最后都是右孩子节点上的,前序遍历的rootinIndex到最后也都是右孩子节点上的
if (rootinIndex < in.length - 1) {
root.right = reConstructBinaryTree(
Arrays.copyOfRange(pre, rootinIndex + 1, pre.length),
Arrays.copyOfRange(in, rootinIndex + 1, in.length));
}
return root;
}

public static void main(String[] args) {
int[] preOrder = { 1, 2, 4, 7, 3, 5, 6, 8 };
int[] inOrder = { 4, 7, 2, 1, 5, 3, 8, 6 };
TreeNode root = reConstructBinaryTree(preOrder, inOrder);
inOrder(root);
System.out.println();
preOrder(root);
System.out.println();
postOrder(root);
}

public static void preOrder(TreeNode n) {
if (n != null) {
System.out.print(n.val + ",");
preOrder(n.left);
preOrder(n.right);
}
}

public static void inOrder(TreeNode n) {
if (n != null) {
inOrder(n.left);
System.out.print(n.val + ",");
inOrder(n.right);
}
}

public static void postOrder(TreeNode n) {
if (n != null) {
postOrder(n.left);
postOrder(n.right);
System.out.print(n.val + ",");
}
}

}

class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 递归