秋招-数据结构-二叉树篇

2023-11-01

秋招-数据结构-二叉树篇

介绍

  • 基本信息

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。

  • 优缺点

顺序存储可能会浪费空间,但是读取某个指定的节点的时候效率比较高,链式存储相对二叉树比较大的时候浪费空间较少,但是读取某个指定节点的时候效率偏低O(nlogn),整体考虑二叉树是从空间和时间上都较为平衡的一种结构。

题目思路

说过二叉树的递归分为「遍历」和「分解问题」两种思维模式,分别代表回溯算法和动态规划的底层思想。

例题

标准二叉树例题

104. 二叉树的最大深度

image-20220723232352485

标准的遍历问题,使用递归遍历,获取深度,有以下两种思路:

  • 动态规划
class Solution {
    public int maxDepth(TreeNode root) {
        if (root==null) return 0;

        return findPath(root,0);
    }

    int findPath(TreeNode node, int dep) {
        if (node==null){
            return dep;
        }
        int leftDepth = findPath(node.left,dep+1);
        int rightDepth = findPath(node.right,dep+1);
         return Math.max(leftDepth, rightDepth);
    }
}
  • 遍历
class Solution {

    int maxDep = 0;
    int dep = 0;
    public int maxDepth(TreeNode root) {
        traverse(root);
        return maxDep;
    }

    void traverse(TreeNode root){
        if (root == null) {
            maxDep = Math.max(maxDep,dep);
            return;
        }
        dep++;
        traverse(root.left);
        traverse(root.right);
        dep--;
    }

}

分解问题例题

543. 二叉树的直径

image-20220724223719845

有两种思路:

自顶向下:遍历+计算当前遍历到的节点的长度,每向下到一个新的节点就要重新计算当前新节点的最大路径值。

自底向上:遍历+在向上return的时候将长度带回去,避免了重复计算深度,(实际上是后序遍历+分解问题的思路)以下为该思路解法:

class Solution {
    int max = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        if(root==null) return 0;  
        distance(root);
        return max-1;
    }

    int distance(TreeNode root){
        if(root==null) return 0;

        int lenL = distance(root.left);
        int lenR = distance(root.right);
        max = Math.max(max,lenL+lenR+1);
        return Math.max(lenL,lenR)+1;
    }
}

后序遍历例题

114. 二叉树展开为链表

image-20220724235423007

后序遍历代表,最后处理结果——将左节点改为现右节点,将原右节点放到现右节点末尾。

class Solution {
    public void flatten(TreeNode root) {
        ana(root);
    }

    void ana(TreeNode root){
        if(root==null) return;
        ana(root.left);
        ana(root.right);

        if(root.left!=null&&root.right==null){
            root.right = root.left;
            root.left = null;
        }

        if(root.left!=null&&root.right!=null){
            TreeNode teR = root.right;
            root.right = root.left;
            root.left = null;

            TreeNode te = root.right;
            while(te.right!=null){
                te = te.right;
            }
            te.right = teR;      
        }
    }
}

前序遍历例题

116. 填充每个节点的下一个右侧节点指针

image-20220725224525138

前序遍历代表,优先将计算做完再遍历

class Solution {
    public Node connect(Node root) {
        ana(root);
        return root;
    }

    void ana(Node root){
        if(root == null) return;
        if(root.left!=null)
            root.left.next = root.right;
        if(root.right!=null&&root.next!=null)    
            root.right.next = root.next.left;

        ana(root.left);
        ana(root.right);

    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

秋招-数据结构-二叉树篇 的相关文章

随机推荐

  • STL : 栈 stack 与 队列 queue

    Stack include
  • App 崩溃(闪退)原因

    缓存垃圾过多 由于安卓系统的特性如果长时间不清理垃圾文件 会导致越来越卡也会出现闪退情况 运行的程序过多导致内存不足 应用版本兼容问题 如果应用版本太低 会导致不兼容 造成闪退 此外 有些新版本 在调试中 也会造成应用闪退 解决方法 如果是
  • Mysql常用函数大全

    一 数学函数 ABS x 返回x的绝对值 BIN x 返回x的二进制 OCT返回八进制 HEX返回十六进制 CEILING x 返回大于x的最小整数值 EXP x 返回值e 自然对数的底 的x次方 FLOOR x 返回小于x的最大整数值 G
  • rocketmq消息重试和死信队列

    1 消息重试 若Consumer消费某条消息失败 则RocketMQ会在重试间隔时间后 将消息重新投递给Consumer消费 若达到最大重试次数后消息还没有成功被消费 则消息将被投递至死信队列 消息重试只针对集群消费模式生效 广播消费模式不
  • openshift简介

    openshift 简介 架构 简介 Openshift是一个开源容器云平台 是一个基于主流的容器技术Docker和K8s构建的云平台 Openshift底层以Docker作为容器引擎驱动 以K8s作为容器编排引擎组件 并提供了开发语言 中
  • 如何实现AD圆弧走线--AD走完线后自动倒成圆角/AD倒圆弧方法(Altium Designer)

    一 脚本获取 在AD软件PCB中如何实现圆弧走线 在网上搜索 得到的答案都是
  • 看得见的实力!传智教育「智能机器人软件开发」课程,打造新型互联网人才!

    在日常生活中 你一定看到过这些场景 进入商场或银行 会有机器人帮你解决问题 疫情期间 火神山医院通过机器人给患者送餐 新型物流企业 机器人自动进行货物分拣 这些以前只能在电影中看到的场景 现在已逐渐融入到我们的生活中 机器人的出现 在不经意
  • Java-计算素数

    判断输入的数字是不是素数 public class SuShu public static void main String args java util Scanner s new java util Scanner System in
  • android 11.0 launcher3 workspace app列表页不显示某个app图标

    目录 1 概述 2 核心代码 3 核心代码功能分析 3 1 LoadTask java中代码分析
  • watch gt3 鸿蒙,华为Watch3有什么功能-华为Watch3功能介绍

    华为Watch3是一款配置相当不错的智能手表 即将在近期发布 那么华为Watch3手表究竟怎么样 华为Watch3手表有什么功能呢 接下来小编就为大家分享一下关于华为Watch3手表的功能介绍 对华为Watch3手表感兴趣的不要错过了 华为
  • flask综合案例-蓝图+列表的增删改查+模板继承

    flask Blueprint蓝图 通俗解释 蓝图就是把所有的路由都分解成一块一块的 再把这些块和app联系 怎么联系 在view中定义一个蓝图 蓝图其实就是原来所用的app 只不过是换了一个名字 定义完了之后 还要在 init 中注册 相
  • adb命令一键安装当前文件夹下所有apk

    项目需要 需要批量安装apk到手机中 大概100个 于是弄了个脚本来代劳 同时考虑到直接用adb输入命令来安装的 会比较麻烦 于是写了以下脚本 安装文件时 直接用鼠标拖入apk文件到脚本再回车即可开始安装 bat文件内容 echo off
  • (一)PLY 文件格式

    PLY Format PLY or Stanford Polygon format defines a flexible and systematic scheme for storing graphical objects that ar
  • 【华为OD机试】不开心的小朋友【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 游乐场里增加了一批摇摇车 非常受小朋友欢迎 但是每辆摇摇车同时只能有一个小朋友使用 如果没有空余的摇摇车 需要排队等候 或者直接离开 最后没有玩上的小朋友会非常不开心
  • Linux安装以太坊geth客户端

    操作比较简单 首先可以到网站上看看最新版的版本号 https geth ethereum org downloads wget https gethstore blob core windows net builds geth linux
  • Python123 练习5

    文章目录 1 一元二次方程求根 2 百钱买百鸡 3 鸡兔同笼 4 最大公约数和最小公倍数 5 判断三角形并计算面积 6 判断IP地址合法性 7 回文素数 8 反素数 9 今天是第几天 10 提取首字符 11 判断火车票座位 如果文章内容或代
  • mount -o loop 解释

    回环设备 loop back devices 回环设备 loopback device 允许用户以一个普通磁盘文件虚拟一个块设备 设想一个磁盘设备 对它的所有读写操作都将被重定向到读写一个名为 disk image 的普通文件而非操作实际磁
  • 王道——数据结构——图(1)

    系列文章目录 其他章节相关文章 王道 数据结构 栈和队列 1 王道 数据结构 树与二叉树 1 本章节其他相关文章 文章目录 系列文章目录 其他章节相关文章 本章节其他相关文章 前言 一 邻接表矩阵法 一 图的建立 1 1 不带权图的建立 1
  • 华为OD机试备考攻略 以及题库目录分值说明 考点说明

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的 Q1 Q2 Q3 Q4 笔者专栏的题库分为2023和2022 2023的题库是包括2022 11 Q4第四季度 之后以及2023年的题库 2022的题库是包括202
  • 秋招-数据结构-二叉树篇

    秋招 数据结构 二叉树篇 介绍 基本信息 二叉树是n个有限元素的集合 该集合或者为空 或者由一个称为根 root 的元素及两个不相交的 被分别称为左子树和右子树的二叉树组成 是有序树 当集合为空时 称该二叉树为空二叉树 优缺点 顺序存储可能