思路如下:
1、在preorder中,第一个元素一定是根节点,接着我们要找出在inorder中该节点的位置,如示例,根节点为3,在中序遍历中3的位置下标是1,这就说明3左边的元素为3的左子树,右边为右子树。
2、便可以知道根节点的左右子树各自的个数,即3的左子树只有1个,右子树就有5-1-1=3个,于是我们可以将preorder和inorder分别拆分开来,获得左右子树各自的新的inorder和preorder,递归调用即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
//for循环遍历找到根节点
for(int i=0;i<inorder.length;i++){
//当找到根节点
if(inorder[i]==preorder[0]){
TreeNode root=new TreeNode(inorder[i]);
//如果根节点左边还有元素
if(i!=0){
//定义子inorder和子preorder
int[] ninorder=new int[i];
int[] npreorder=new int[i];
//将左子树取出来
for(int j=0;j<i;j++){
ninorder[j]=inorder[j];
npreorder[j]=preorder[j+1];
}
//递归得到左子节点
root.left=buildTree(npreorder,ninorder);
}
//如果根节点右边有元素
if(i!=preorder.length-1){
int len=inorder.length;
//定义子order和子preorder
int[] ninorder=new int[len-i-1];
int[]npreorder=new int[len-i-1];
//将右子树取出来
for(int j=i+1;j<len;j++){
ninorder[j-i-1]=inorder[j];
npreorder[j-i-1]=preorder[j];
}
//递归得到右子节点
root.right=buildTree(npreorder,ninorder);
}
//返回根节点
return root;
}
}
return null;
}
}
原题地址:
105. 从前序与中序遍历序列构造二叉树