Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

这篇具有很好参考价值的文章主要介绍了Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

leetcode 110.平衡二叉树

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

视频链接:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili

思路

平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

本题就是求左右子树的高度差,如果差值<=1,就是平衡二叉树了。这道题可以和求二叉树深度的题对比一下,这样印象会更深刻一些。求高度用后序,求深度用前序。因为高度是从下到上去查,所以要左右中的依次往上遍历,而求深度是从上到下去查,所以先中间,再左右,要中左右依次往下遍历。

代码实现

class Solution {
public:
    int getHeight(TreeNode* node) {
        if (node == NULL) {
            return 0;
        }
        int leftHeight = getHeight(node->left);
        if (leftHeight == -1) return -1;
        int rightHeight = getHeight(node->right);
        if (rightHeight == -1) return -1;
        return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1 ? false : true;
    }
};

leetcode 257.二叉树的所有路径

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

视频链接:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili

思路

这道题需要找路径,自然是从上往下找,所以说要用前序(中左右),但是这道题也需要用到回溯,要知道回溯递归是一家。如图所示:

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和,leetcode,数据结构,算法,c++

 使用vector结构的path容器来记录路径是为了方便回溯。

代码实现

class Solution {
private:

    void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
        path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中 
        // 这才到了叶子节点
        if (cur->left == NULL && cur->right == NULL) {
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size() - 1]);
            result.push_back(sPath);
            return;
        }
        if (cur->left) { // 左 
            traversal(cur->left, path, result);
            path.pop_back(); // 回溯
        }
        if (cur->right) { // 右
            traversal(cur->right, path, result);
            path.pop_back(); // 回溯
        }
    }

public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};

leetcode 404.左叶子之和

题目链接:404. 左叶子之和 - 力扣(LeetCode)

视频链接:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili

思路

·首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。

例如:这棵二叉树左叶子之和为0

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和,leetcode,数据结构,算法,c++

 如图:这棵二叉树左叶子之和为21

Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和,leetcode,数据结构,算法,c++

 所以左叶子的定义为:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。(把上图的‘9’当作节点A,更有助于理解)

需要注意的是,想要判断子节点是不是左叶子,必须是遍历到父节点的时候才能判断!文章来源地址https://www.toymoban.com/news/detail-671127.html

代码实现

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right== NULL) return 0;

        int leftValue = sumOfLeftLeaves(root->left);    
        if (root->left && !root->left->left && !root->left->right) { 
            leftValue = root->left->val;
        }
        int rightValue = sumOfLeftLeaves(root->right);  

        int sum = leftValue + rightValue;               // 中
        return sum;
    }
};

到了这里,关于Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode257. 二叉树的所有路径

    写在前面: 题目链接:LeetCode257. 二叉树的所有路径 题目难度:简单 编程语言:C++ 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 输入:root = [1,2,3,null,5] 输出:[“1-2-5”,“1-3”] 示例 2 : 输入:roo

    2024年02月10日
    浏览(40)
  • leetcode 257. 二叉树的所有路径

             这题需要用到递归+回溯,也是我第一次接触回溯这个概念。          大致思路是:         在 reversal 函数中,首先将当前节点的值加入到路径 path 中。然后判断当前节点是否为叶子节点,即没有左右子节点。如果是叶子节点,将路径转化为字符串并保存到

    2024年02月12日
    浏览(38)
  • ※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径

    ---------------🎈🎈257. 二叉树的所有路径 题目链接🎈🎈------------------- 时间复杂度O(N) 空间复杂度O(N) 深度优先遍历 添加了 StringBulider 替代字符串拼接提升效率 toString() 转化为String .append() 添加元素 时间复杂度O(N) 空间复杂度O(N)

    2024年02月20日
    浏览(37)
  • 【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树

    二叉树节点的深度: 指从根节点到该节点的最长简单路径边的条数或者节点数 (取决于深度从0开始还是从1开始) 二叉树节点的高度: 指从该节点到叶子节点的最长简单路径边的条数后者节点数 (取决于高度从0开始还是从1开始) 【前序求的是深度,后序求的是高度】 -

    2024年02月19日
    浏览(53)
  • 力扣 257. 二叉树的所有路径

    题目来源:https://leetcode.cn/problems/binary-tree-paths/description/    C++题解1:使用递归,声明了全局变量result,遇到叶子节点就将字符串添加到result中。 递归三步法: 1. 确认传入参数:当前节点+已有路径(字符串); 2. 确认终止条件:遇到叶子节点,即左右节点都为空时,将当前

    2024年02月11日
    浏览(36)
  • leetcode 110. 平衡二叉树

            平衡二叉树 ,经典题目 。需要利用到之前求二叉树高度的思路。 先定义一个求高度的函数,然后使用递归的方式判断左子树和右子树的高度差是否小于等于1,下面上代码:                 挺经典的题,思路值得借鉴。

    2024年02月12日
    浏览(44)
  • 【LeetCode】110. 平衡二叉树

    思路 对二叉树做先序遍历, 从底至顶返回子树最大高度 ,若判定 某子树不是平衡树则“剪枝”直接向上返回 。 递归返回值 : 当节点 root 左、右子树的高度差 1:返回 -1,代表此子树不是平衡树; 否则返回以节点 root 为根节点的 子树的最大高度 ,即节点 root 的左、右子树

    2024年02月08日
    浏览(43)
  • LeetCode | 110. 平衡二叉树

    OJ链接 首先计算出二叉树的高度 然后计算当前节点的左右子树的高度,然后判断当前节点的左右子树高度差是否超过 1,最后递归地检查左右子树是否也是平衡的。

    2024年02月04日
    浏览(50)
  • LeetCode刷题--- 二叉树的所有路径

    个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题       【     】 【C++】                  【   】 数据结构与算法       【    】 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的

    2024年01月19日
    浏览(42)
  • 110. 平衡二叉树【75】

    难度等级:容易 上一篇算法: 102. 二叉树的层序遍历【206】 力扣此题地址: 110. 平衡二叉树 - 力扣(Leetcode) 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树 每个节点  的左右两个子树的高度差的绝对值不超过 1 。  

    2023年04月22日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包