Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
根据树的先序遍历和中序遍历来构造树。
构造树一般有递归和迭代两种做法,这里给出最普遍的递归方法。
求解步骤
- 根据先序遍历序列的第一个结点确定树的根结点
- 由根结点在中序遍历序列中的位置分成左子树序列和右子树序列
- 对左子树序列和右子树序列递归调用上述方法得到整棵树
例子
先序:a bcde fghij
后序:cbed a hgijf
/**
* 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) {
return buildTreeHelper(preorder,inorder,0,0,preorder.length-1,inorder.length-1);
}
private TreeNode buildTreeHelper(int[] preorder, int[] inorder,int preStart,int inStart,int preEnd,int inEnd)
{
if(preStart>preEnd||inStart>inEnd)
return null;
TreeNode root=new TreeNode(preorder[preStart]);
int inorderRoot=0;
for(int i=inStart;i<=inEnd;++i)
{
if(inorder[i]==root.val)
{
inorderRoot=i;
break;
}
}
root.left=buildTreeHelper(preorder,inorder,preStart+1,inStart,preStart+inorderRoot-inStart,inorderRoot-1);
root.right=buildTreeHelper(preorder,inorder,preStart+inorderRoot-inStart+1,inorderRoot+1,preEnd,inEnd);
return root;
}
}