您的位置:首页 > Web前端

剑指offer-重建二叉树

2017-06-02 09:25 309 查看


题目描述

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

import java.util.Arrays;

public class 重建二叉树 {

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

public static void main(String[] args) {
// TODO Auto-generated method stub

}

/*前序遍历结果的第一个节点肯定是跟节点,那么在中序节点中找到这个点,
* 这个点之前的是跟的左子树,之后的是右子数。。。循环*/
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode node = null;
for (int i = 0; i < in.length; i++) {
if (in[i]==pre[0]) {
node = new TreeNode(in[i]);
node.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1),
Arrays.copyOfRange(in, 0, i));
node.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre.length),
Arrays.copyOfRange(in, i+1, in.length));
}
}
return node;
}
}


第一次的写法:

package 剑指offer第二遍;

public class 重建二叉树 {

class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

public static void main(String[] args) {
// TODO Auto-generated method stub

}

public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode head= null;
if (pre.length==0||in.length==0) {
return head;
}
if (pre.length==1||in.length==1) {
head = new TreeNode(pre[0]);
return head;
}else {
head = new TreeNode(pre[0]);
int headindex = 0;
for (int i = 0; i < in.length; i++) {
if (in[i]==pre[0]) {
headindex = i;
}
}

int[] leftpre = new int[headindex];
int[] leftin = new int[headindex];
for (int i = 0; i < leftpre.length; i++) {
leftpre[i] = pre[i+1];
leftin[i] = in[i];
}
head.left = reConstructBinaryTree(leftpre, leftin);

int[] rightpre = new int[pre.length-headindex-1];
int[] rightin = new int[pre.length-headindex-1];
for (int i = 0; i < rightin.length; i++) {
rightpre[i] = pre[headindex+i+1];
rightin[i] = in[headindex+i+1];
}
head.right = reConstructBinaryTree(rightpre, rightin);
}
return head;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: