Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7] inorder = [9,3,15,20,7]
Return the following binary tree:
3 / \ 9 20 / \ 15 7
给出先序遍历和中序遍历构造这棵树,根据preorder可以得到根节点,根据inorder可以得到左右子树的内容,两者相辅相成,得到最终结果
在刚开始的时候犹豫了很久在递归函数中到底要穿什么参数,其实有很重要的一点是不管是什么遍历,左右子树之间是没有交叉的。
/**
* 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 build(0,0,inorder.length-1,preorder,inorder);
}
public TreeNode build(int prestart,int instart,int inend,int[] preorder,int[] inorder){
//有了先序遍历的起始位置实际上就有了根
if(instart>inend||prestart>=preorder.length) return null;
TreeNode temp=new TreeNode(preorder[prestart]);
//int pos=Arrays.binarySearch(inorder,preorder[prestart]); //根在中序遍历的位置
//在网上查了一个可以定位数组中元素的位置的函数,在使用之后出现数组越界异常
//经再次详细查阅资料后发现此方法只适用于有序数组,所以还是自己老实遍历吧
int pos=0;
while(inorder[pos]!=preorder[prestart]){
pos++;
}
temp.left=build(prestart+1,instart,pos-1,preorder,inorder);
temp.right=build(prestart+pos-instart+1,pos+1,inend,preorder,inorder);
return temp;
}
}
还有就是调用库函数的时候注意使用的情况,好好看文档。
其实代码,把思路想清楚再动手就很好写了。
扫描二维码关注公众号,回复:
2680861 查看本文章