day15

2023-11-19

一、平衡二叉树

110.平衡二叉树
依旧是使用后序遍历来统计高度。

递归过程中,发现某节点的左右子树的高度差超过了1,我们就直接返回-1,不返回节点的高度了。

递归函数的参数和返回值:

int getHeight(TreeNode * node){}

终止条件:

if(node==nullptr) return 0;

单层递归逻辑:

如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?
当然是其左子树高度和其右子树高度的差值。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

int leftHeight = getHeight(node->left);   // 左
if (leftHeight == -1)
    return -1;
int rightHeight = getHeight(node->right); // 右
if (rightHeight == -1)
    return -1;

int res;
if (abs(leftHeight - rightHeight) > 1)  // 根
    res = -1;
else
{
    res = 1 + max(leftHeight, rightHeight);
}
return res;

完整代码:

class Solution
{
public:
    int getHeight(TreeNode *node)
    {
        if (node == nullptr)
            return 0;

        int leftHeight = getHeight(node->left); // 左
        if (leftHeight == -1)
            return -1;
        int rightHeight = getHeight(node->right); // 右
        if (rightHeight == -1)
            return -1;

        int res;
        if (abs(leftHeight - rightHeight) > 1)  // 根
            res = -1;
        else
        {
            res = 1 + max(leftHeight, rightHeight);
        }
        return res;
    }
    bool isBalanced(TreeNode *root)
    {
        return getHeight(root) == -1 ? false : true;
    }
};

二、[回溯小难]二叉树的所有路径

257.二叉树的所有路径

我们这里要使用前序遍历。

递归函数的参数和返回值:

void travelsal(TreeNode *node){}

递归终止条件:

if (node->left == nullptr && node->right == nullptr)

单层递归逻辑:

// 单层递归处理逻辑
// 左
if (node->left)
{
    travelsal(node->left);
    path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
}
// 右
if (node->right)
{
    travelsal(node->right);
    path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
}
class Solution
{
private:
    vector<string> res;
    vector<int> path;
    void travelsal(TreeNode *node)
    {
        path.push_back(node->val); // 中 写在这里? 因为最后一个叶子节点也要加入到path中
        if (node->left == nullptr && node->right == nullptr)
        {
            string s;
            for (int i = 0; i < path.size() - 1; i++)
            {
                s += to_string(path[i]);
                s += "->";
            }
            s += to_string(path[path.size() - 1]); // 记录最后一个节点(叶子节点)
            res.push_back(s);
            return;
        }
        // 中 本该写在这里
		//path.push_back(node->val);
        
        // 单层递归处理逻辑
        // 左
        if (node->left)
        {
            travelsal(node->left);
            path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
        }
        // 右
        if (node->right)
        {
            travelsal(node->right);
            path.pop_back(); // 为啥在这里pop_back()? 这是回溯的过程
        }
    }

public:
    vector<string> binaryTreePaths(TreeNode *root)
    {
        travelsal(root);
        return res;
    }
};

1、为啥用前序?
这样才方便让父节点指向孩子节点,找到对应的路径。

2、为什么会有回溯?
因为我们要用vector装数据,然后要把数据弹出去一部分,方便递归其他路径。

三、左叶子之和

404.左叶子之和

使用后续遍历最为简洁。
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。
在这里插入图片描述
递归函数的参数和返回值:

int travelsal(TreeNode *node){}

终止条件:

 if (node == nullptr)
     return 0;

单层递归逻辑:

int leftnum = travelsal(node->left); // 左
if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)
    leftnum = node->left->val;
int rightnum = travelsal(node->right);// 右
int sum = leftnum + rightnum; // 中
return sum;

完整代码:

class Solution
{
public:
    int travelsal(TreeNode *node)
    {
        if (node == nullptr)
            return 0;

        int leftnum = travelsal(node->left);
        if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)
            leftnum = node->left->val;
        int rightnum = travelsal(node->right);
        int sum = leftnum + rightnum;
        return sum;
    }
    int sumOfLeftLeaves(TreeNode *root)
    {
        return travelsal(root);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day15 的相关文章

  • 二叉树经典题目

    1 判断一个节点是否在一棵二叉树中 先判断是否在左子树 若在 则不再去右子树中寻找 若不在 再去右子树中寻找 要注意递归的条件判断 bool IsInTree Node root Node node if root NULL node NU
  • 二叉树深度和高度_二叉树的高度和深度

    二叉树深度和高度 In this tutorial we will learn how to find height and depth of binary tree with program implementation in C It
  • 【数据结构】唯一确定一个二叉树的方法

    唯一确定一棵二叉树的方法 在了解以何种方式能唯一确定一棵二叉树之前 需要先认识树的遍历方式有哪几种 树的遍历方式 先序遍历 后序遍历 层序遍历 二叉树的遍历方式 先序遍历 中序遍历 后序遍历 层序遍历 确定的方式 那么如何唯一确定一棵二叉树
  • 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一 基本概念 每个结点最多有两棵子树 左子树和右子树 次序不可以颠倒 性质 1 非空二叉树的第n层上至多有2 n 1 个元素 2 深度为h的二叉树至多有2 h 1个结点 满二叉树 所有终端都在同一层次 且非终端结点的度数为2 在满二叉树中若
  • 二叉树之层次遍历(js)

    二叉树之层次遍历 输入一棵二叉树 你的任务是从上到下 从左到右的顺序输出各个结点的值 每个结点都是按照从根节点到它移动序列给出 L表示左 R表示右 在输入中 每个结点的左右括号之间没有空格 相邻节点之间用一个空格隔开 输入 11 LL 7
  • 【leetcode】----102二叉树的层序遍历

    102二叉树的层序遍历 给你一个二叉树 请你返回其按 层序遍历 得到的节点值 即逐层地 从左到右访问所有节点 示例 二叉树 3 9 20 null null 15 7 3 9 20 15 7 返回其层次遍历结果 3 9 20 15 7 BF
  • 二叉树的结点数

    二叉树的结点数 10分 已知二叉树的结点结构定义如下 typedef struct NODE char data struct NODE lch rch NODE 说明 data 为数据域 均为英文大写字母 lch 和 rch 分别为指示左
  • java实现赫夫曼树以及赫夫曼编码和解码(用byte[])

    首先对于赫夫曼编码有个大概的理解 赫夫曼编码 Huffman Coding 又称霍夫曼编码 是一种编码方式 可变字长编码 VLC 的一种 Huffman于1952年提出一种编码方法 该方法完全依据字符出现概率来构造异字头的平均长度最短的码字
  • 学习笔记-创建赫夫曼树

    赫夫曼树 给定 n 个权值作为 n 个叶子结点 构造一棵二叉树 若该树的带权路径长度 wpl 达到最小 称这样的二叉树为最优二叉树 也称为哈夫曼树 Huffman Tree 还有的书翻译为霍夫曼树 赫夫曼树是带权路径长度最短的树 权值较大的
  • 剑指Offer07:重建二叉树(Java)

    题目描述 解法思路 一开始想了半个小时都没想出来 幸好得到大佬的帮助 终于做出来 嘻嘻 采用递归的思想 不断拆分左右子树即可 首先我们通过前序遍历可以看到这个树的根节点是3 然后通过中序遍历 我们可以知道9是左子树 15 20 7是右子树
  • 剑指 Offer 27. 二叉树的镜像 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 27 二叉树的镜像 1 递归算法 根据二叉树镜像的定义 考虑递归遍历 d f s mathrm dfs dfs 二叉树 交换每个节点的左 右子节点 即可生成 二叉树的镜像 递归解析
  • 二叉树交换左右子树的三种实现方式

    二叉树交换左右子树的三种实现方式 顺序存储结构 链式存储结构 顺序存储结构 交换左右子树实际上就是同层之间交换位置 在顺序存储结构下 先确定树的深度 再划分层 每个层内做交换即可 链式存储结构 递归实现很简单 非递归可以借助栈或队列辅助实现
  • 二叉树层次遍历的相关应用(伪代码)

    1 层次遍历 void LevelOrder BTree t Queue Q initQueue Q EnQueue Q t while Empty Q TNode p DeQueue Q if p gt lchird EnQueue Q
  • LeetCode——1302. 层数最深叶子节点的和

    题目描述 给你一棵二叉树的根节点 root 请你返回层数最深的叶子节点的和 示例 1 输入 root 1 2 3 4 5 null 6 7 null null null null 8 输出 15 示例 2 输入 root 6 7 8 2 7
  • 【数据结构】树与二叉树

    文章目录 树型结构 什么是树型结构 树型结构的概念 树的表示形式 树的应用 二叉树 二叉树的概念 两种特殊的二叉树 二叉树的性质 二叉树性质练习 练习一 解析 练习二 解析 练习三 解析 练习四 解析 总结 树型结构 什么是树型结构 树是一
  • python二叉树类定义,列表转二叉树,leetcode本地调试

    如果想用本地IDE调试leetcode上的题目 可以使用以下辅助类 二叉树类定义 Definition for a binary tree node class TreeNode def init self x self val x sel
  • 求二叉树中两个指定节点的最短距离

    给定一个二叉树 找到该树中两个指定节点间的最短距离 思路 求最近公共祖先节点 然后再求最近公共祖先节点到两个指定节点的路径 再求两个节点的路径之和 const shortestDistance function root p q let l
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • 【数据结构初阶】第七节.树和二叉树的基本操作

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 Java初阶数据结构 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 二叉树的快速构建 二 二叉树的遍历 2 1 前序遍历 2 2 中序遍历 2
  • 关于数据结构中的叶节点和二度节点的关系(通俗的理解)。

    简单记录一下自己的一些地方和对于这个问题我的一些见解 有说的不好的地方欢迎指正 这里只给出一种理解 另一种利用公式进行理解的 我就不写了 因为csdn里面太多了 先说结论 叶节点的数目 二度节点 1 首先来看这张图 可以看到这个图大体是包含

随机推荐

  • 将一条直线朝着划线方向进行偏移

    写了一个将一条link朝着划线方向偏移一定的距离 供参考 def cal poi geom1 geom2 dis 将一条直线link朝着划线方向偏移 param geom1 param geom2 param dis return dis
  • 0动态规划中等 NC206 跳跃游戏(二)

    NC206 跳跃游戏 二 描述 给定一个非负整数数组nums 假定最开始处于下标为0的位置 数组里面的每个元素代表下一跳能够跳跃的最大长度 如果可以跳到数组最后一个位置 请你求出跳跃路径中所能获得的最多的积分 1 如果能够跳到数组最后一个位
  • 信息系统项目管理师学习笔记

    信息系统项目管理师学习笔记 信息化从小到大分为以下5个层次 产品信息化 企业信息化 产业信息化 国民经济信息化 社会生活信息化 国家信息化体系包括6要素 1 信息技术应用 2 信息资源 3 信息网络 4 信息技术和产业 5 信息化人才 6
  • Javascript高级应用:文件操作篇

    Javascript是网页制作中离不开的脚本语言 依靠它 一个网页的内容才生动活泼 富有朝气 但也许你还没有发现并应用它的一些更高级的功能吧 比如 对文件和文件夹进行读 写和删除 就象在VB VC等高级语言中经常做的工作一样 怎么样 你是否
  • 数据结构第五章(堆、哈夫曼树、哈夫曼编码)

    什么是堆 堆是按照一定顺序组织的完全二叉树 优先队列 特殊的 队列 取出元素的顺序是依照元素的优先权 关键字 大小 而不是元素进入队列的先后顺序 是否可以采用二叉树存储结构 可以 查找与删除的时间复杂度均为以2为底n的对数即log 2 n
  • OpenWRT 添加 WEB 配置界面实战记录

    本篇是记录在 Openwrt 镜像中添加 自定义的 web 配置界面过程 编译进 openwrt 的系统镜像中 第一步 建立项目文件目录 mkdir p feeds luci applications luci app Gateway mk
  • 我说的不是小鹅通

    互联网大致是这么三极 1 内容 应用表现为新闻 文学 知识 音乐 视频 直播 内容或专业媒体原创 或自媒体 UGC 或爬虫聚合 表现形式为文字 图片 音频 视频 承载物是一个个的工具App 2 游戏 3 电子商务 1 数据内容 小鹅通跟随的
  • 从零开始写一个Javascript解析器

    最近在研究 AST 之前有一篇文章 面试官 你了解过 Babel 吗 写过 Babel 插件吗 答 没有 卒 为什么要去了解它 因为懂得 AST 真的可以为所欲为 简单点说 使用 Javascript 运行Javascript代码 这篇文章
  • 手摸手带你玩转Vue3——Vue2升级Vue3

    今年年初 尤大大公布了一个重磅消息 将Vue3作为Vue的默认版本 这无疑不是对我们开发人员的内卷煽风点火 vue默认版本改动意味着 官方将会把Vue研发重心放到vue3上 vue2也开始走下坡路 至于淘汰过时只是时间问题了 从而周边生态
  • VMWare虚拟机网络配置

    Bridged 桥接模式 桥接模式相当于虚拟机和主机在同一个真实网段 VMWare充当一个集线器功能 一根网线连到主机相连的路由器上 所以如果电脑换了内网 静态分配的ip要更改 图如下 NAT 网络地址转换模式 NAT模式和桥接模式一样可以
  • 【华为OD机试c++/python】最少线段覆盖【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖住所有线段 输入描述 第一行输入为
  • A-小美种果树(二分)-- 牛客周赛 Round 12

    输入 1 2 10 输出 6 解析 二分 注意两端端点L R的取值 include
  • html怎样设置同意服务条款,用户使用协议及服务条款.html

    用户使用协议及服务条款 axure utils getTransparentGifPath function return resources images transparent gif axure utils getOtherPath
  • 智慧煤矿技术理论篇1-5G与WiFi6技术

    5G VS WiFi6 5G技术 第五代移动通信技术 英语 5th generation mobile networks或5th generation wireless systems 5th Generation 简称5G或5G技术 是最
  • 数据结构-栈和队列(C/C++)

    栈和队列 一 实验目的 熟练掌握栈以及队列的结构特点 二 实验内容 运用栈和队列的结构特点完成相应的基本操作和实例 三 实验步骤 过程以及运行程序截图 栈 问题1 栈的基本操作 在插入栈元素的时候做一个统一输入 达到一次性任意输入0 Sta
  • 【每日一练】79—CSS实现扫描二维码动画

    二维码的应用越来越普通 加个好友 付个款 做个核酸 想去一个地方 还要扫个场所码 总之 需要二维码的地方越来越多 因此 在这样的大环境里 如何让你的码与众不同 引人注意 就显得非常重要 今天我们就来练习一个二维码的动画效果 具体效果如下 看
  • html5自带属性验证表单必填

    html5自带属性验证表单必填 2014年02月25日 Html5 共 366字 字号 小 中 大 6条评论 阅读 6 515 次 为了防止恶意注册 通常会验证表单必填 实现方法以js为主 略微麻烦 今天才发现 html5如今已自带验证表单
  • 注册表常用键值意义

    HKEY CURRENT USER Software Policies Microsoft Internet Explorer Control Panel Internet Explorer选项类 HomePage dword 000000
  • IDEA下java程序的简单调试

    一 本次任务实现的是一个java的程序调试 首先本次进行调试的一个程序是实现从1累加到100的功能 是在IDEA下进行编写的 如图所示 将其运行之后得到的结果如图所示 把第12行的输出语句给取消掉注释之后再运行一次得到的结果如图所示 这里由
  • day15

    文章目录 一 平衡二叉树 二 回溯小难 二叉树的所有路径 三 左叶子之和 一 平衡二叉树 110 平衡二叉树 依旧是使用后序遍历来统计高度 递归过程中 发现某节点的左右子树的高度差超过了1 我们就直接返回 1 不返回节点的高度了 递归函数的