刷题10.30

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

题目

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

代码

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
       map=new HashMap<>();
       for(int i=0;i<inorder.length;i++){
           map.put(inorder[i],i);
       } 
       return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
    }
    public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
        if(inBegin>=inEnd || postBegin>=postEnd) return null;
        int rootIndex=map.get(postorder[postEnd-1]);
        TreeNode root=new TreeNode(inorder[rootIndex]);
        int len_left=rootIndex-inBegin;
        root.left=findNode(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+len_left);
        root.right=findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+len_left,postEnd-1);
        return root;
    }
}

总结

后序最后一个结点是根结点;
根据根节点,在中序序列中划分左右子树;
递归

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

题目

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点

代码

class Solution {
    Map<Integer,Integer> map;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        map=new HashMap<>();
        for(int i=0;i<inorder.length;i++){
            map.put(inorder[i],i);
        }
        return findNode(inorder,0,inorder.length,preorder,0,preorder.length);

    }
    public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] preorder,int preBegin,int preEnd){
        if(inBegin>=inEnd || preBegin>=preEnd) return null;
        int rootIndex=map.get(preorder[preBegin]);
        TreeNode root=new TreeNode(inorder[rootIndex]);
        int len_left=rootIndex-inBegin;
        root.left=findNode(inorder,inBegin,rootIndex,preorder,preBegin+1,preBegin+1+len_left);
        root.right=findNode(inorder,rootIndex+1,inEnd,preorder,preBegin+len_left+1,preEnd);
        return root;
    }
}

总结

前序序列第一个结点是根节点,
在中序序列中找到根节点,分左右子树
递归

前序+后序 无法构成一个树。没有办法确定左右子树。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值