首页 > 编程语言 >代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径 、404.左叶子之和、 222.完全二叉树的节点个数

代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径 、404.左叶子之和、 222.完全二叉树的节点个数

时间:2024-07-20 22:57:29浏览次数:20  
标签:right TreeNode val int root 随想录 二叉树 第十五天 left

110.平衡二叉树

题目:. - 力扣(LeetCode)

思路:后序遍历计算高度

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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;
        if(abs(leftHeight-rightHeight)>1)
        return -1;
        return 1+max(leftHeight,rightHeight);
    }
    bool isBalanced(TreeNode* root) {
    if(getHeight(root)==-1)
    return false;
    else
    return true;
    }
};

257. 二叉树的所有路径

题目:. - 力扣(LeetCode)

思路:保存路径的字符串参数使用复制构造起到回溯的效果

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* node,string path,vector<string>& res){
        path+=(to_string(node->val));
        if(node->left==NULL&&node->right==NULL){
            res.push_back(path);
            return;
        }
        if(node->left){
            traversal(node->left,path+"->",res);
        }
        if(node->right){
            traversal(node->right,path+"->",res);
        }
        return;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
    vector<string> res;
    if(root==NULL)
    return res;
    string path;
    traversal(root,path,res);
    return res;
    }
};

404.左叶子之和

题目:. - 力扣(LeetCode)

思路:后序遍历,通过父亲结点来判断字结点是否为左叶子

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
 * right(right) {}
 * };
 */
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == 0)
            return 0;
        int leftsum = sumOfLeftLeaves(root->left);
        int rightsum = sumOfLeftLeaves(root->right);
        if(root->left&&!root->left->left&&!root->left->right)
        leftsum=root->left->val;
        return leftsum + rightsum;
    }
};

222.完全二叉树的节点个数

题目:. - 力扣(LeetCode)

思路:完全二叉树的性质,满二叉树的结点个数为2的n次方-1

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == nullptr) return 0;
        TreeNode* left = root->left;
        TreeNode* right = root->right;
        int leftDepth = 0, rightDepth = 0; // 这里初始为0是有目的的,为了下面求指数方便
        while (left) {  // 求左子树深度
            left = left->left;
            leftDepth++;
        }
        while (right) { // 求右子树深度
            right = right->right;
            rightDepth++;
        }
        if (leftDepth == rightDepth) {
            return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,所以leftDepth初始为0
        }
        return countNodes(root->left) + countNodes(root->right) + 1;
    }
};

标签:right,TreeNode,val,int,root,随想录,二叉树,第十五天,left
From: https://blog.csdn.net/dtgfhfd/article/details/140502293

相关文章

  • 如何建立一颗二叉树?(数据结构:树 + hash表 / 广搜BFS)
    一个二叉树,树中每个节点的权值互不相同。现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。输入格式第一行包含整数 N,表示二叉树的节点数。第二行包含 N 个整数,表示二叉树的后序遍历。第三行包含 N 个整数,表示二叉树的中序遍历。输出格式输出一行 N 个整数,......
  • 代码随想录移除元素二刷
    代码随想录移除元素二刷leetcode27这道题思路的话可以这样去理解,用两个指针,一个慢指针,一个快指针。先让快指针往前面去探路,也就是去遍历数组,遇到不为val的值再去把该值赋值给nums[slow],slow指针+1,遇到为val的值,nums[slow]不做任何操作,继续移动fast指针。具体代码如下:classSo......
  • 【数据结构】二叉树———Lesson2
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 数据结构(二叉树-1)
    文章目录一、树1.1树的概念与结构1.2树的相关术语1.3树的表示二、二叉树2.1二叉树的概念与结构2.2特殊的二叉树满二叉树完全二叉树2.3二叉树的存储结构三、实现顺序结构二叉树3.1堆的概念与结构3.2堆......
  • 代码随想录算法训练营第33天 | 贪心4:452. 用最少数量的箭引爆气球、435. 无重叠区间
    代码随想录算法训练营第33天|贪心4:452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间452.用最少数量的箭引爆气球https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/代码随想录https://programmercarl.com/0452.用最......
  • 代码随想录day 31 用最少数量的箭引爆气球 | 无重叠区间 | 划分字母区间
    用最少数量的箭引爆气球用最少数量的箭引爆气球解题思路先根据数组中的第一个参数进行排序,之后通过记录最小右区间来判断是否重叠或者进入下个重叠区。贪心的思想是有重叠就尽可能地进行重叠,从而达到局部最优知识点重叠区间,贪心心得学会了如何判断和找寻重叠区间的方法无......
  • 代码随想录算法训练营第31天 | 贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.
    代码随想录算法训练营第31天|贪心3:134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列134.加油站https://leetcode.cn/problems/gas-station/description/代码随想录https://programmercarl.com/0134.加油站.html135.分发糖果https://leetcode.cn/problems......
  • 【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计
    初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索底层逻辑......
  • 【数据结构】超详解二叉树
    1、树的概念及结构堆与树的结构类似堆的概念及代码实现-CSDN博客树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根结点没有前驱结点除......
  • 二叉树的种类
    二叉树:二叉树是每个节点最多有两个子树的树结构。完全二叉树:除最后一层外,每一层上的节点数量均达到了最大值,在最后一层上只缺少右边的若干节点。满二叉树:除最后一层无任何子节点外,每一层上的所有节点都有两个子节点的二叉树。二叉搜索树(二叉排序树、二叉查找树):左子树<根节点<右......