原题:
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
题意:给你一个前序遍历和中序遍历的数组,要求构建二叉树
代码和思路:
前序遍历:就是先访问
根节点------左子树------右子树 所以前序遍历数组的第一个数就是根节点。
中序遍历:就是先访问
左子树------根节点------右子树 根节点在中间,左边是左子树,右边是右子树
4
/ \
2 7
/ \ / \
1 3 6 9
上面的二叉树为例子:
前序遍历的结果是:4213769
中序遍历的结果是:1234679 可以看到4在最中间,2在13中间,7在69中间。这样就用迭代即可
/**
* 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 recursion(0,0,inorder.length-1,preorder,inorder);
}
private TreeNode recursion(int preStart,int inStart,int inEnd,int[] preorder, int[] inorder){
if(preStart > preorder.length-1 || inStart > inEnd){
return null;
}
//根据前序遍历找出根节点
TreeNode root = new TreeNode(preorder[preStart]);
int inIndex = 0;
//找出根节点在中序遍历中的位置,用inIndex记录
for(int i = inStart;i<=inEnd;i++){
if(inorder[i]==root.val){
inIndex = i;
}
}
//左树是中序数组的 开头(inStart) 到 根节点(inIdex-1)
root.left = recursion(preStart+1,inStart,inIndex-1,preorder,inorder);
//右树是中序数组的 根节点(inIdex+1)到 结尾(inEnd)
root.right = recursion(preStart+inIndex-inStart+1,inIndex+1,inEnd,preorder,inorder);
return root;
}
}