算法刷题计划五——剑指offer题集20(LeetCode)

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    Map<Integer,Integer> treeMap;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n=preorder.length;
        treeMap=new HashMap<Integer, Integer>();
        for(int i=0;i<n;i++)
        {
            treeMap.put(inorder[i],i);
        }
        return myBuildTree(preorder,inorder,0,n-1,0,n-1);
    }
    TreeNode myBuildTree(int[] preorder, int[] inorder,int pl,int pr,int il,int ir) {
        if(pl>pr) 
            return null;
        int preorder_root=pl;
        int inorder_root=treeMap.get(preorder[preorder_root]);
        TreeNode root=new TreeNode(preorder[preorder_root]);
        int treeleft_size=inorder_root-il;
        root.left=myBuildTree(preorder,inorder,pl+1,pl+treeleft_size,il,inorder_root-1);
        root.right=myBuildTree(preorder,inorder,pl+treeleft_size+1,pr,inorder_root+1,ir);
 
        return root;
    }
}

个人总结: 多练,二叉树不熟练

数值的整数次方

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

class Solution {
    public double myPow(double x, int n) {
        if(x==0) return 0;
        long b=n;
        if(b<0){
            x=1/x;
            b=-b;
        }
        double res=1.0;
        while(b>0){
            if((b&1)==1){
                res*=x;
            }
            x*=x;
            b>>=1;
        }
        return res;
    }
}

个人总结: 多练习

二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder,0,postorder.length-1);
    }
    boolean recur(int[] postorder,int l,int r)
    {
        if(l>r)return true;
        int m=l;
        for(;m<r;m++)
        {
            if(postorder[m]>postorder[r])
                break;
        }
        for(int i=m;i<r;i++)
        {
            if(postorder[i]<postorder[r])
                return false;
        }
        return recur(postorder,l,m-1)&&recur(postorder,m,r-1);
    }
}

个人总结: 思路不够清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值