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

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

目录:

链接

题目链接:

https://leetcode.cn/problems/balanced-binary-tree/

https://leetcode.cn/problems/binary-tree-paths/

解题及思路学习

110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

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

示例 1:

!https://assets.leetcode.com/uploads/2020/10/06/balance_1.jpg

输入:root = [3,9,20,null,null,15,7]
输出:true

思考:跟之前求数的高度差不多。判断两颗子树的高度绝对值是否不超过1.先用递归试试。

递归思路代码:

递归中嵌套了递归,代码时间复杂度直接拉满。

class Solution {
public:
    int maxHeight(TreeNode* root) {
        if (root == NULL) return 0;
        int leftHeight = maxHeight(root->left);
        int rightHeight = maxHeight(root->right);
        int result = 1 + max(leftHeight, rightHeight);
        return result;
    }

    bool isBalanced(TreeNode* root) {
        if (root == NULL) return true;

        bool leftBalance = isBalanced(root->left);
        bool rightBalance = isBalanced(root->right);

        int left = maxHeight(root->left);
        int right = maxHeight(root->right);

        if ( abs(left - right) <= 1 && leftBalance && rightBalance) return true;
        return false;
    }
};

随想录:求解高度用后序遍历,求解深度用前序遍历。

class Solution {
public:
		// 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
    int getHeight(TreeNode* root) {
        if (root == NULL) return 0;

        int left = getHeight(root->left);
        if (left == -1) return -1;
        int right = getHeight(root->right);
        if (right == -1) return -1;

        if (abs(left - right) > 1) return -1;
        int result = max(left, right) + 1;
        return result;
    }

    bool isBalanced(TreeNode* root) {
        if (getHeight(root) != -1) return true;
        return false; 
    }
};

257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

!https://assets.leetcode.com/uploads/2021/03/12/paths-tree.jpg

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

思考:可以用一个二维vector容器来记录每个所有根节点到叶子节点的路径。其中每一条数据代表一条数据。

随想录:需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。

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;
    }
};

vector::pop_back() 是"vector" 头文件的库函数,用于从vector 尾部删除一个元素,从vector 后面删除元素并返回void。

这道题目中,因为要使用path来记录所有路径,但是只有一个内存地址,所以,当遍历下一个节点时,需要把前面节点进行释放,所以需要pop_back()操作。

404.左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

!https://assets.leetcode.com/uploads/2021/04/08/leftsum-tree.jpg

输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

思考:这题可以用后续递归遍历,先统计左右子树的左叶子之和。

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

        int result = 0;
        if (root->left && root->left->left == NULL && root->left->right == NULL) {
            result += root->left->val;
        }
        return result + right + left;
    }
};

好像层序遍历也能行,只需要判断一下是否为左叶子。

随想录: 减少了一层递归。并且在左边返回的数值那里更清楚了。左边节点只要时左叶子节点,那就只返回该节点的值就行。它后面不会有其他节点。如果不是,则该节点一定不会是叶子节点,所以只需要直接用left值就行。

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == NULL) return 0; 
        if (root->left == NULL && root->right ==NULL) return 0;   //当为左叶子节点的时候返回0,减少一层

        int left = sumOfLeftLeaves(root->left);
        if (root->left && root->left->left == NULL && root->left->right == NULL) {
            left = root->left->val;
        }
        int right = sumOfLeftLeaves(root->right);
        return left + right;
    }
};

困难及收获

困难

今天全是递归,回溯算法那里有点巧妙。

今日收获

递归和回溯算法文章来源地址https://www.toymoban.com/news/detail-479495.html

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

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

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

相关文章

  • 力扣 257. 二叉树的所有路径

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

    2024年02月11日
    浏览(29)
  • LeetCode257. 二叉树的所有路径

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

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

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

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

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

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

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

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

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

    2024年01月19日
    浏览(30)
  • 力扣 110. 平衡二叉树

    题目来源:https://leetcode.cn/problems/balanced-binary-tree/description/     C++题解1:递归法,后续遍历,从叶子节点开始,判断左右子树的深度差是否大于1。 代码随想录:思想是一致的,当为不平衡树时可以节省右子树的遍历。 C++题解2:迭代法,较为繁琐。由根节点往叶子节点需计

    2024年02月11日
    浏览(30)
  • 110. 平衡二叉树【75】

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

    2023年04月22日
    浏览(28)
  • 每日一练:LeeCode-110、平衡二叉树【二叉树】

    本文是力扣LeeCode-110、平衡二叉树 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度 平衡二叉树定义 为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过

    2024年01月22日
    浏览(28)
  • LeetCode | 110. 平衡二叉树

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

    2024年02月04日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包