标签:二叉树的重建
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
/**
* 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
* 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
* 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},
* 则重建二叉树并返回。
* @author user
*
*
*思路:前序遍历的第一个数据即为根节点的数据,则在中序遍历中进行扫描去找到根节点所在的位置,那么
*根据中序遍历的特点,根节点之前即为树的左子树,之后即为右子树。同样前序遍历中根节点之后分别为左子树和右子树,
*那么就可以找到左子树和右子树根节点。此时就可以使用递归了
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
//根节点
TreeNode rootNode = new TreeNode(pre[0]);
//判断前序遍历的长度
if(pre.length == 1) { //没有子树
rootNode.left = null;
rootNode.right = null;
return rootNode;
}
//获取根节点值,即前序遍历的第一个
int rootNodeVal = pre[0];
//在中序遍历中查找根节点的位置
int j;
for (j = 0; j < in.length; j++) {
if(in[j] == rootNodeVal) break;
}
//构建左子树
if(j > 0) { //判断是不是没有左子树
int[] preo = new int[j];
int[] ino = new int[j];
//获得左子树的前序遍历
for (int i = 0; i < j; i++) {
preo[i] = pre[i+1];
}
//获得左子树的中序遍历
for (int i = 0; i < j; i++) {
ino[i] = in[i];
}
//递归
rootNode.left = reConstructBinaryTree(preo, ino);
} else {
rootNode.left = null;
}
//构建右子树
if(pre.length - j - 1 > 0) { //判断是不是没有右子树
int[] preo = new int[pre.length - j - 1];
int[] ino = new int[pre.length - j - 1];
//获取右子树的前序遍历和中序遍历
for(int i = j + 1; i < pre.length; i++) {
preo[i - j -1] = pre[i];
ino[i - j -1] = in[i];
}
//递归
rootNode.right = reConstructBinaryTree(preo, ino);
} else {
rootNode.right = null;
}
return rootNode;
}
}本文出自 “12212886” 博客,请务必保留此出处http://12222886.blog.51cto.com/12212886/1963601
标签:二叉树的重建
原文地址:http://12222886.blog.51cto.com/12212886/1963601