题目
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
代码
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
TreeNode build(int[] preorder,int preStart,int preLast ,// 构造新二叉树的方法
int[] inorder,int inStart,int inLast){
if (preStart>preLast) return null;
// 先序遍历的第一个结点是根节点
int rootVal= preorder[preStart];
TreeNode root=new TreeNode(rootVal);
// 在中序中寻找该节点索引
int index=-1;
for (int i = inStart; i <= inLast; i++) {
if (inorder[i]==rootVal){
index=i;
break;
}
}
int leftnum=index-inStart;//左边字数长度
int rightnum=inLast-index;//右边字数长度
// 递归左右孩子
root.left=build(preorder,preStart+1,preStart+leftnum,inorder,inStart,index-1);
root.right=build(preorder,preStart+leftnum+1,preLast,inorder,index+1,inLast);
return root;
}
}
方法
- 前序遍历第一个即是本次调用根节点
- 利用该根节点的值,在中序遍历的数组中寻找根节点,找到之后左边就是根节点的左孩子,右边就是根节点的右孩子
- 获得左右孩子的长度后,就可以递归调用左右孩子的build方法
- 本题关键点就是找到左右孩子的长度