您的位置:首页 > Web前端

剑指offer--(4) 重建二叉树

2017-09-16 12:56 344 查看

剑指offer–(4) 重建二叉树

题目描述

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

思路描述:

1. 前序遍历的第一个节点为根节点,故1为根节点;

2. 根据中序遍历,可得{4,7,2}为节点1的左子树的中序遍历,{5,3,8,6}节点1的右子树的中序遍历;

3. 再根据前序遍历,得到{2,4,7}为节点1的左子树的前序遍历,{3,5,8,6}为节点1右子树的中序遍历;

4. 分别对左子树和右子树重复步骤1,2,3

5. 即可得到二叉树为

1

/ \

2 3

/ / \

4 5 6

\ /

7 8

Java 实现过程为:

package com;

class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}

public class 重建二叉树 {

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] pre={1,2,4,7,3,5,6,8};
int[] in={4,7,2,1,5,3,8,6};
TreeNode treeNode= reConstructBinaryTree(pre,in);
//System.out.println(treeNode);
//打印中序遍历
System.out.print("中序-->");
printIn(treeNode);
System.out.println();
System.out.print("前序-->");
printPre(treeNode);
System.out.println();
System.out.print("后序-->");
printBack(treeNode);
}
//打印中序遍历
private static void printIn(TreeNode treeNode) {
// TODO Auto-generated method stub
if(treeNode.left!=null)
printIn(treeNode.left);
System.out.print(treeNode.val+" ");
if(treeNode.right!=null)
printIn(treeNode.right);

}
//打印前序遍历
private static void printPre(TreeNode treeNode) {
// TODO Auto-generated method stub

System.out.print(treeNode.val+" ");
if(treeNode.left!=null)
printPre(treeNode.left);
if(treeNode.right!=null)
printPre(treeNode.right);

}
//打印后序遍历
private static void printBack(TreeNode treeNode) {
// TODO Auto-generated method stub
if(treeNode.left!=null)
printBack(treeNode.left);
if(treeNode.right!=null)
printBack(treeNode.right);
System.out.print(treeNode.val+" ");
}
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0||pre.length==0){
return null;
}
//前序遍历的第一个节点即为根节点
return getTreeNode(pre,0,pre.length-1,in,0,in.length-1);
}

private static TreeNode getTreeNode(int [] pre,int p_start,int p_end,int [] in,int i_start,int i_end){
if(p_start>=0&&i_start>=0&&p_end<pre.length&&i_end<in.length&&i_start <=i_end&&p_start<=p_end){
TreeNode treeNode=new TreeNode(pre[p_start]);
if(p_start==p_end)
return treeNode;
int index=getIndex(pre[p_start], in, i_start, i_end);
int l_left=index-i_start;
treeNode.left = getTreeNode(pre,p_start+1,p_start+l_left,in,i_start,i_start+l_left-1);
treeNode.right = getTreeNode(pre,p_start+l_left+1,p_end,in,i_start+l_left+1,i_end);
return treeNode;
}else{
return null;
}
}

private static int getIndex(int k,int [] in,int i_start,int i_end){
for(int i=i_start;i<=i_end;i++){
if(in[i]==k)
return i;
}
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: