首页 > 编程语言 >代码随想录算法训练营第 15 天 |LeetCode110平衡二叉树 LeetCode257二叉树的所有路径 LeetCode404左叶子之和 LeetCode222完全二叉树节点之和

代码随想录算法训练营第 15 天 |LeetCode110平衡二叉树 LeetCode257二叉树的所有路径 LeetCode404左叶子之和 LeetCode222完全二叉树节点之和

时间:2024-07-18 15:28:50浏览次数:17  
标签:node 15 int sum 随想录 二叉树 节点 left

代码随想录算法训练营

Day15 代码随想录算法训练营第 15 天 |LeetCode110平衡二叉树 LeetCode257二叉树的所有路径 LeetCode404左叶子之和 LeetCode222完全二叉树节点之和


目录


前言

LeetCode110平衡二叉树

讲解文档
视频讲解

LeetCode257二叉树的所有路径

讲解文档
视频讲解

LeetCode404左叶子之和

讲解文档
视频讲解

LeetCode222完全二叉树节点之和

讲解文档
视频讲解


一、基础

对于深度和高度的补充:
深度从上向下求,用前序遍历
高度从下向上求,用后序遍历
昨天的最大深度用后序是因为最大深度实际上是根节点的高度

二、LeetCode110平衡二叉树

1.题目链接

LeetCode110平衡二叉树

2.思路

(1)平衡二叉树的判定:任何一个节点的左右子节点的高度差的绝对值不超过1
(2)求高度:后序
(3)递归
1)参数和返回值
以Node为根节点的子树是平衡二叉树,返回节点高度
以node为根节点的子树不是平衡二叉树,返回-1
2)边界条件
空节点的高度为0
3)单层递归
求左右子节点高度l和r
如果l为-1或者r为-1,则返回-1
如果l与r的差的绝对值大于1,返回-1
返回 l和r的最大值+1

3.题解

class Solution {
public:
    int get_height(TreeNode* node) {
        if (node == NULL)
            return 0;
        int l = get_height(node->left);
        int r = get_height(node->right);
        if (l == -1 || r == -1)
            return -1;
        if (abs(l - r) > 1)
            return -1;
        return 1 + max(l, r);
    }
    bool isBalanced(TreeNode* root) {
        int res = get_height(root);
        if (res == -1)
            return 0;
        return 1;
    }
};

三、LeetCode257二叉树的所有路径

1.题目链接

LeetCode257二叉树的所有路径

2.思路

(1)路径是从根节点开始的,从上到下,所以用前序
(2)递归
1)返回值和参数
参数包括节点指针,答案的引用,路径数组的引用
路径用数组存放便于回溯
2)边界条件
叶节点为边界
将路径数组转换为字符串,放入答案数组
3)单层递归
中:将node的值放入路径数组,这个语句放在最前面,因为叶节点也要存放
左:如果node左节点非空则进行递归调用和回溯
右:如果node右节点非空则进行递归调用和回溯

3.题解

class Solution {
public:
    void get_path(TreeNode* node, vector<string>& ans, vector<int>& path) {
        path.push_back(node->val);
        if (node->left == NULL && node->right == NULL) {
            string s;
            for (int i = 0; i < path.size() - 1; i++) {
                s += to_string(path[i]);
                s += "->";
            }
            s += to_string(path[path.size() - 1]);
            ans.push_back(s);
            return;
        }
        if (node->left) {
            get_path(node->left, ans, path);
            path.pop_back();
        }
        if (node->right) {
            get_path(node->right, ans, path);
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> ans;
        vector<int> p;
        if (root == NULL)
            return ans;
        get_path(root, ans, p);
        return ans;
    }
};

四、LeetCode404左叶子之和

1.题目链接

LeetCode404左叶子之和

2.思路

(1)左叶子:作为父节点的左子结点的叶节点
用父节点判断左叶子:

(node->left != NULL && node->left->left == NULL &&
            node->left->right == NULL

则node->left 为左叶子
(2)递归
1)参数和返回值
参数是节点指针,和指针
2)终止条件:遇到左叶子终止,求和
3)单层递归:判空,递归调用

3.题解

class Solution {
public:
    void left_leaves(int* sum, TreeNode* node) {
        if (node->left != NULL && node->left->left == NULL &&
            node->left->right == NULL) {
            *sum += node->left->val;
        }
        if (node->left)
            left_leaves(sum, node->left);
        if (node->right)
            left_leaves(sum, node->right);
    }
    int sumOfLeftLeaves(TreeNode* root) {
        int sum = 0;
        left_leaves(&sum, root);
        return sum;
    }
};

五、LeetCode222完全二叉树节点之和

1.题目链接

LeetCode222完全二叉树节点之和

2.普通二叉树做法

遍历+计数

class Solution {
public:
    void count(TreeNode * node,int *sum)
    {
        if(node==NULL)return;
        *sum+=1;
        count(node->left,sum);
        count(node->right,sum);
    }
    int countNodes(TreeNode* root) {
        int ans=0;
        count(root,&ans);
        return ans;
    }
};

3.完全二叉树性质

(1)完全二叉树的定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
若r根节点为第一层,最底层为第 h 层,则该层包含 1~ 2 ^(h-1)个节点
(2)递归
1)参数:和的指针,节点指针
2)终止条件:节点为空则深度为0,返回
3)递归
分别求左右子树深度,
如果左右子树深度相同,则以节点为根的子树为满二叉树,用性质求
如果左右子树深度不相同,则以节点为根的子树不为满二叉树,递归调用左右子节点,求左右子树结点数并求和,再+1

class Solution {
public:
    void count(TreeNode* node, int* sum) {
        if (node == NULL)
            return;
        TreeNode* l = node->left;
        TreeNode* r = node->right;
        int l_depth = 0;
        int r_depth = 0;
        while (l) {
            l_depth++;
            l = l->left;
        }
        while (r) {
            r_depth++;
            r = r->right;
        }
        if (l_depth == r_depth) {
            *sum += (2 << l_depth) - 1;
            return;
        }
        count(node->left, sum);
        count(node->right, sum);
        *sum += 1;
    }
    int countNodes(TreeNode* root) {
        int sum = 0;
        count(root, &sum);
        return sum;
    }
};

总结

从上向下求,例如求深度和路径,用前序遍历
从下向上求,例如求高度,用后序遍历

标签:node,15,int,sum,随想录,二叉树,节点,left
From: https://blog.csdn.net/2301_79647020/article/details/140487762

相关文章

  • 全球1-15级(12,5米)高程terrain和pak切片数据
       Terrain切片是一种分级存储的地形数据,用于地理信息系统(GIS)、虚拟地球、灾害模拟与管理以及环境保护与规划。PAK切片则是一种特定格式的瓦片数据,广泛应用于游戏开发、虚拟现实(VR)和增强现实(AR),以及工程和建筑领域。   本数据集基于全球12.5米DEM数据(http://www.gis......
  • 代码随想录算法训练营第28天 | 回溯4:491.递增子序列、46.全排列、47.全排列 II
    代码随想录算法训练营第28天|回溯4:491.递增子序列、46.全排列、47.全排列II491.递增子序列https://leetcode.cn/problems/non-decreasing-subsequences/代码随想录https://programmercarl.com/0491.递增子序列.html#算法公开课46.全排列https://leetcode.cn/problems/pe......
  • 【数据结构】树和二叉树——Lesson1
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 算法力扣刷题记录 五十一【654.最大二叉树】
    前言二叉树篇,继续。记录五十一【654.最大二叉树】一、题目阅读给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的......
  • 算法力扣刷题记录 五十【106.从中序与后序遍历序列构造二叉树】和【105.从前序与中序
    前言记录三十八的四、二叉树构建通过层序遍历的数组实现。层序遍历中,某个节点下标是i,那么左孩子的下标2i+1,右孩子的下标2i+2。这是统一的规律。那么通过中序序列和后序序列如何构造二叉树?通过中序序列和前序序列如何构造二叉树?通过前序序列和后序序列如何构造二叉树?一......
  • 从前序与中序遍历序列构造二叉树-递归
    题目描述:个人题解:        只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。这样的话,我们就......
  • 代码随想录二刷复习(二分法)
    二分法模板:1:左闭右闭区间写法第一种写法,我们定义target是在一个在左闭右闭的区间里,也就是[left,right](这个很重要非常重要)。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left,right]区间,所以有如下两点:while(left<=right)要使用<=,因为left==rig......
  • Java二叉树经典例题
    目录一.相同的树二.翻转二叉树三.平衡二叉树四.对称二叉树五.根据前(后)和中序排序构建二叉树1.前序和中序构建2.后序和中序构建六.二叉树的层序遍历七.二叉树非递归遍历1.前序遍历2.中序遍历3.后序遍历八.总结前言:前面说过树是通过递归定义的。做二叉树的题,递......
  • 树与二叉树
    树与二叉树目录树与二叉树基本概念基本术语根双亲结点孩子节点节点的层次节点的度叶子树的高度有序树与无序树二叉树二叉树概念:二叉树基本特性满二叉树/完美二叉树:完全二叉树:平衡二叉树:退化二叉树:二叉树的链式存储树的遍历BST树基本概念插入节点删除节点遍历代码基本概念树是一......
  • 2024.7.15 近期练习
    P3488[POI2009]LYZ-IceSkates我们对于鞋码为\(x\)的人,贪心地,显然先把鞋小的给他穿。所以就有了一个暴力的检验方法:从左往右扫,并对应修改。但是这样太慢。这是一个二分图匹配问题,考虑Hall定理。对于任意\(1\lel\ler\len\),当\(sum(a_l\sima_r)\le(r-l+1+d)k\)时合......