从前序遍历与中序遍历序列构造二叉树

桃扇骨 2023-09-30 09:47 125阅读 0赞

我们可以知道 中序遍历时先遍历完左子树 再遍历根结点最后遍历右子树,前序遍历是先遍历根结点再遍历左子树,最后遍历右子树,综上可知,前序遍历的(根+左子树)个数 = 中序遍历的(左子树+根)个数。利用这个性质,可知下边的:

对于前序遍历(根左右)

设前序遍历出的数组开始下标为preLeft,结束为preRight














左子树 右子树
preLeft [preLeft+1,pIndex-inLeft+preLeft] [pIndex-inLeft+preLeft+1,preRight]

对于中序遍历(左根右)

设中序遍历出数组开始下标为inLeft,结束下标为inRight














左子树 右子树
[inLeft-pIndex-1] pIndex [pIndex+1,inRight]

代码:

  1. class Solution {
  2. public TreeNode buildTree(int[] preorder, int[] inorder) {
  3. int preLen = preorder.length;
  4. int vinLen = inorder.length;
  5. if(preLen!=vinLen) return null;
  6. Map<Integer,Integer> map = new HashMap<>();
  7. for(int i=0;i<vinLen;i++){
  8. map.put(inorder[i],i);
  9. }
  10. return buildTree(map,preorder,inorder,0,preLen-1,0,vinLen-1);
  11. }
  12. public TreeNode buildTree(Map<Integer,Integer> map,int[] preorder,int[] inorder,int preLeft,int preRight,int vinLeft,int vinRight){
  13. if(preLeft>preRight || vinLeft>vinRight) return null;
  14. int rootVal = preorder[preLeft];
  15. int pIndex = map.get(rootVal);
  16. TreeNode root = new TreeNode(rootVal);
  17. root.left = buildTree(map,preorder,inorder,preLeft+1,pIndex-vinLeft+preLeft,vinLeft,pIndex-1);
  18. root.right = buildTree(map,preorder,inorder,pIndex-vinLeft+preLeft+1,preRight,pIndex+1,vinRight);
  19. return root;
  20. }
  21. }

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读