剑指offer计划20( 搜索与回溯算法中等)—java

1.1、题目1

剑指 Offer 07. 重建二叉树

1.2、解法

注释解法。

1.3、代码


class Solution {
    int[] preorder;
    HashMap map = new HashMap<>();
    // 前序遍历 preorder: 根 -- 左 -- 右   第一个肯定是根节点
    // 中序遍历 inorder: 左 -- 根 -- 右
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        return rebuild(0, 0, inorder.length - 1);
    }

    // pre_root_index : 根节点 在 前序遍历中的下标
    // in_left_index: 该节点在中序遍历中的左边界
    // in_right_index: 该节点在中序遍历中的右边界
    public TreeNode rebuild(int pre_root_index, int in_left_index, int in_right_index){
       if(in_left_index > in_right_index)  return null;
       // 根节点在中序遍历中的位置:in_root_index
       int in_root_index = map.get(preorder[pre_root_index]);
       // 创建一个根节点
       TreeNode node = new TreeNode(preorder[pre_root_index]);
       // 寻找node的左节点:
       // 在前序遍历中的位置就是  根节点的下标 + 1(右边一个单位)
       // 在中序遍历中的位置就是: 1. 左边界不变,2. 右边界就是根节点的左边一个单位 in_root_index - 1
       node.left = rebuild(pre_root_index + 1, in_left_index, in_root_index - 1);
       // 寻找node的右节点:
       // 在前序遍历中的位置就是  根节点的下标 + 左子树长度 + 1
       // 在中序遍历中的位置就是: 1. 左边界在根节点的右边一个单位  in_root_index + 1, 2. 右边界不变
       node.right = rebuild(pre_root_index + in_root_index - in_left_index + 1, in_root_index + 1, in_right_index);
       return node;
    }
}

2.1、题目2

剑指 Offer 16. 数值的整数次方

2.2、解法

分类讨论,判断内容,通过将数拆开两半来减少性能消耗(容易栈溢出)

2.3、代码


class Solution {
    public double myPow(double x, int n) {
        if(n

3.1、题目3

剑指 Offer 33. 二叉搜索树的后序遍历序列

3.2、解法

递归开始判断,找到第一个大于根节点的值,然后找出左子树和右子树的两个区间,
通过递归再次判断

3.3、代码

class Solution {
    public boolean verifyPostorder(int[] postorder) {
        return recur(postorder,0,postorder.length - 1);
    }
    boolean recur(int[] postorder, int start, int end){
        if(start >= end) return true;
        int temp = start;
        // 找到右子树结点第一次出现的地方。(或者说是遍历完整棵左子树)
        for(int i = start; i  postorder[end])
                ++rightTreeNode;
        }
        return rightTreeNode == end && recur(postorder,start,temp) && recur(postorder,temp + 1,end - 1);
    }
}

Original: https://www.cnblogs.com/cxykhaos/p/15314157.html
Author: 程序员khaos
Title: 剑指offer计划20( 搜索与回溯算法中等)—java

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598474/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux ssh连接自动断开问题

    场景描述:云上的虚拟机使用public ip连接ssh时,一直提示已经连接,但是就会自动关闭 通过正常虚拟机作为跳板,能够连接到目标机子上,检查发现进程正常,但是就一直连接不上 发…

    Linux 2023年6月7日
    072
  • 网络安全中常用浏览器插件、拓展

    引言 现在的火狐、Edge( Chromium内核)、Chrome等浏览器带有插件、拓展(Plugin)的功能。这些插件中有的可以过滤广告,有的提供便捷的翻译,有的提供JavaSc…

    Linux 2023年6月6日
    084
  • CentOS 文本编辑器

    Linux 终端的文本编辑器中,较著名的有:Nano、Vim、Emacs。其它文本编辑器还有 Gedit、Sublime,Atom 等等。 1.1、基础命令 nano:打开 nan…

    Linux 2023年6月8日
    0107
  • fastdfs集群部署

    fastdfs集群部署 参考链接:https://www.cnblogs.com/penngke/p/15396701.html部署架构如下: 部署规划 2台主机,数据存储节点共1…

    Linux 2023年6月8日
    088
  • Arthas-开源的java诊断工具,非常有用

    常用命令 help 查看帮助 help COMMAND 查看指定&#…

    Linux 2023年6月13日
    0127
  • nslookup:command not found的解决办法

    nslookup:command not found的解决办法 通过nslookup查看DNS记录,在这里遇到了一个小插曲,nslookup:command not found(未…

    Linux 2023年6月7日
    073
  • 每天一个 HTTP 状态码 206

    206 Partial Content 是当客户端请求时使用了Range头部,服务器端回复… 206 Partial Content 206 Partial Conte…

    Linux 2023年6月7日
    0108
  • redis cluster 数据迁移

    1,先停止java的后台和.net的后台,停止对redis cluster进行访问 2,然后 cd /usr/local/redis-cluster/7001 每个节点都要做如下操…

    Linux 2023年5月28日
    080
  • rm命令弱爆了!

    大家好,我是良许。 创建、删除和修改文件是用户在 Linux 系统中执行的非常常见操作。大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了。但是如…

    Linux 2023年6月14日
    091
  • 操作系统实战45讲笔记-01 程序的运行过程:从代码到机器运行

    计算机硬件是无法直接运行C 语言文本程序代码的,需要 C 语言编译器,把这个代码编译成具体硬件平台的二进制代码。再由具体操作系统建立进程,把这个二进制文件装进其进程的内存空间中,才…

    Linux 2023年6月7日
    076
  • 了解CFS完全公平调度器

    CFS模拟理想多任务调度 公平,即对于n个正在运行的任务,当这些任务同时不断地运行时,CPU会尽可能分配给他们1/n的处理时间。 CFS是一种基于加权公平排队思想的调度算法。 精确…

    Linux 2023年6月7日
    090
  • 我的第一个博客

    我就是想试一试 .阿西吧 段狗是傻逼,段狗请看右边的看板娘 posted @2020-06-22 18:56 xiao-c 阅读(17 ) 评论() 编辑 Original: ht…

    Linux 2023年6月7日
    0126
  • ELF文件的笔记

    ELF 说明 ELF文件的英文全称是 The Executable and Link Format, 最初是由UNIX系统实验室开发、发布的ABI(Application Bina…

    Linux 2023年6月7日
    0112
  • Shell脚本之while read line的用法

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    090
  • 1. 斐波那契数 爬楼梯 使用最少花费爬楼梯

    版本一:一维数组记录型 class Solution { public: int fib(int n) { if(n dp(n+1); dp[0] = 0; dp[1] = 1; …

    Linux 2023年6月6日
    080
  • LeetCode_29. 两数相除Divide Two Integers|商的二进制表示与除数的关系

    Problem description Given two integers: dividend and divisor, return dividend/divisor with…

    Linux 2023年6月13日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球