数据结构与算法(中)

3.1.9 判断平衡二叉树

【考点映射】
  • 二叉树
【出现频度】★★★☆
【难度】★★☆
【题目描述】
给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

【参考答案】
平衡二叉树的定义:二叉树的每个节点的左右子树的高度差的绝对值不超过 1,则二叉树是平衡二叉树。平衡二叉树还有一个规律,其所有子数都必须是平衡二叉树,所以我们可以采用递归的方式去判断是否是平衡二叉树。
递归的方法有两种:自顶向下 和 自底向上。
自顶向下递归:
首先需要定义一个求任意一个节点P高度的函数height,有了这个函数,我们就很方便的判断二叉树是否处于平衡状态。
可以利用二叉树的前序遍历,从根节点开始,分别对左右子数进行递归,判断每个节点的高度差是否大于1。自顶向下遍历的弊端就是,对于同一个节点,height函数可能会重复被调用,所以时间复杂度较高。
代码示例(Java):
class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        } else {
            return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
        }
    }

    public int height(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            return Math.max(height(root.left), height(root.right)) + 1;
        }
    }
}
自底向上递归:
如果使用自底向上的做法,则对于每个节点,函数 height 只会被调用一次。
自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 -1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。
代码示例(Java):
class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) >= 0;
    }

    public int height(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = height(root.left);
        int rightHeight = height(root.right);
        if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) {
            return -1;
        } else {
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}

【知识点延伸】
二叉树的遍历:
二叉树的遍历分为三种方式:前序遍历、中序遍历、后序遍历。
这里的前、中、后,都是以父节点的相对位置来说的。
前序遍历:父、左、右
中序遍历:左、父、右
后序遍历:左、右、父
这是什么意思呢?可以看我下面的图解:
我们对其进行前序遍历
同理可得:
中序遍历,遵循左、父、右原则,最终的顺序为:3、5、2、6、1、4、3。
后序遍历,遵循左、右、父原则,最终的顺序为:3、2、5、1、3、4、6。


3.1.10 二分查找

【考点映射】
  • 搜索
  • 数组
【出现频度】★★★★☆
【难度】★☆
【题目描述】
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1, 0, 3, 5, 9, 12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1, 0, 3, 5, 9, 12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

【参考答案】
关于二分查找的算法解释:
前提条件:列表必须是经过排序的。
查找逻辑:(假设列表已经排序,并且元素按从小到大排)
  • 如果目标值等于中间元素,则找到目标值。
  • 如果目标值较小,继续在左侧搜索。
  • 如果目标值较大,则继续在右侧搜索。
代码示例(Python):
def binary_search(nums, target):
    left = 0
    right = len(nums) - 1
    while left <= right:
        center = left + (right - left) // 2
        if nums[center] == target:
            return center
        if target < nums[center]:
            right = center - 1
        else:
            left = center + 1
    return -1


if __name__ == '__main__':
    # 测试代码
    nums = [-1, 0, 3, 5, 9, 12]
    target = 5
    idx = binary_search(nums, target)
    print(idx)
    # 输出:3


3.1.11 什么是深度优先搜索?什么是广度优先搜索?

【考点映射】
  • 搜索
【出现频度】★★★
【难度】★★★

【参考答案】
深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS,即Depth First Search。一般用于解决走迷宫问题、最大路径问题。
其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
深度优先的基本原则:按照某种条件往前试探搜索,如果前进中遭到失败(正如老鼠遇到死胡同)则退回头另选通路继续搜索,直到找到满足条件的目标为止。
例如以A为起点,G为目标开始查找,查找的顺序是:A -> B -> E -> F -> C -> G
广度优先搜索,英文缩写为BFS,即Breadth First Search。属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
和深度优先算法不同的是,广度优先算法是逐层顺序遍历的,讲究的是广度(宽度)。
还是以A为起点,G为目标开始查找,查找的顺序是:A -> B

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

测试岗笔面试真题宝典 文章被收录于专栏

测试工作无非就是点点点,没有太深的技术难度?<br/> 开发转投测试岗,原以为自身的条件能轻松胜任测试岗却反被面试官虐?<br/> 测试岗究竟要准备哪些技术知识去应对面试?<br/> 如何才能在测试岗面试中做到游刃有余?<br/> <p> <span>本专刊从测试岗面试考察的知识点和能力出发,精选出经典的测试岗面试题,不仅给出面试的典型回答和考点分析,还会剖析知识点,将其讲清讲透,让你彻底领悟题目背后所考察的能力,帮你梳理复习测试岗的知识体系。</span> </p> <h3> <span><br /> </span><span><strong>专刊主要分为3大模块:</strong></span> </h3> <p> <span>1. 岗位校招情况介绍:</span> </p> <p> <span>将对整个测试岗位进行详细的介绍,包括测试岗位的分类、市场需求量、薪资情况和校招概况,都会逐一做介绍,让同学们能对测试岗位的校招情况有个大概的了解<br /> 2. 面试考点和面试题讲解:</span> </p> <p> <span>这是本章最为核心的部分,将会以面试题讲解的形式,不仅给出面试题参考答案,还会对考点进行分析,剖析其中的知识点,把知识点讲清讲透,帮助同学们梳理复习测试岗的知识体系。本章涉及的知识板块有:软件测试基础知识、测试用例设计、排查问题的思路、常用的测试工具、计算机操作系统、计算机网络、编程语言和常考的智力题。内容丰富,基本上涵盖了测试面试常考的知识点。<br /> 3. 求职经验分享:</span> </p> <p> <span>本章将详细讲解面试的注意事项:从面试前的准备、面试当天到面试结束收到offer整个过程,都会进行逐一讲解。</span> </p> <p> <span><br /> </span> </p> <h3> <span>专刊大纲:</span> </h3> <p> <span><img src="https://uploadfiles.nowcoder.com/images/20210625/691666214_1624592824918/B4749CDE6B040FF304C11BA36D1276D5" alt="" width="700" height="1692" title="" align="" /><br /> <br /> </span> </p> <h3> <span>购买须知:</span> </h3> <span>①订阅成功后,用户即可通过牛客网 PC 端、App 端享有永久阅读的权限;<br /> ②牛客专刊为虚拟内容服务,订阅成功后概不退款;<br /> ③在专刊阅读过程中,如有任何问题,可在文章评论区底部留言,或添加牛客求职导师,加入读者交流群;<br /> ④想成为牛客作者,请邮件联系pandengfeng@nowcoder.com,邮件主题【牛客作者+写作方向】,并附上个人简历一份及近期作品一份;<br /> ⑤牛客专刊版权归本平台所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布 / 发表,违者将依法追究责任。<br /> </span> <p> <span>了解专刊更多详细信息,请扫码添加丸子老师微信~</span> </p> <p> <br /> </p> <p> <img src="https://uploadfiles.nowcoder.com/images/20210526/999991364_1622023901811/2E767EB5BD55BF57B67C8E5427B978D8" alt="" /> </p>

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务