首页 > 其他分享 >代码随想录打卡Day14

代码随想录打卡Day14

时间:2024-11-05 22:50:10浏览次数:3  
标签:right TreeNode int 随想录 Day14 打卡 root 节点 left

1.力扣226:翻转二叉树

题目描述:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入:root = []
输出:[]

解答代码:

/**
 * 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:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;

        // swap(root->left, root->right);
        // if(root->left) invertTree(root->left);
        // if(root->right) invertTree(root->right);

                
        if(root->left) invertTree(root->left);
        if(root->right) invertTree(root->right);
        swap(root->left, root->right);

        return root;
    }
};

代码逻辑:

这个代码实现了一个递归函数 'maxDepth' 来计算二叉树的最大深度。它采用后序遍历的方法,递归地计算每个节点左右子树的深度,并返回其中较大的值加一,作为当前节点的深度。以下是代码的逐步解释:

 代码讲解

'''cpp
class Solution {
public:
    int maxDepth(TreeNode root) {
        if (root == NULL) return 0;  // 如果节点为空,返回深度 0

        // 后序遍历
        int leftsize = maxDepth(root->left);    // 左:递归计算左子树的深度
        int rightsize = maxDepth(root->right);  // 右:递归计算右子树的深度
        return max(leftsize, rightsize) + 1;    // 中:选择左右子树较大值加1,表示当前节点的深度
    }
};
'''

 解释
1. 终止条件:当 'root == NULL',即遍历到叶子节点的下一层时,返回深度为 0。
2. 递归过程:依次递归计算左右子树的深度 'leftsize' 和 'rightsize'。
3. 返回值:每层递归返回左右子树深度中的最大值加 1,以得到该节点的深度。

 示例
对于以下二叉树:
'''
        3
       / \
      9   20
         /  \
        15   7
'''
调用 'maxDepth' 会输出 '3',因为该树的最大深度是 3。

2.力扣101:对称二叉树

题目描述:

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

解答代码:

/**
 * 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:
    bool compare(TreeNode* left, TreeNode* right) {
        // 空节点的三种情况
        if (left == NULL && right != NULL) return false;
        else if (left != NULL && right == NULL) return false;
        else if (left == NULL && right == NULL) return true;

        else if (left->val != right->val) return false;
        
        bool outside = compare(left->left, right->right);
        bool inside = compare(left->right, right->left);
        return outside && inside;
    }


    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return true;
        bool result = compare(root->left, root->right);
        return result;
    }
};

代码逻辑:

代码用于判断二叉树是否对称,即是否是镜像对称的。代码通过递归的 'compare' 函数,对比二叉树左右子树的结构和节点值来判断树的对称性。

 代码说明
1. compare 函数:递归比较 'left' 和 'right' 两棵子树是否是镜像对称的。判断逻辑如下:
   - 若一边为空而另一边不为空,返回 'false'。
   - 若两边都为空,返回 'true'。
   - 若两节点的值不相等,返回 'false'。
   - 若以上条件均满足,递归检查子节点的对称性。
     - 'outside':递归比较 'left->left' 和 'right->right'。
     - 'inside':递归比较 'left->right' 和 'right->left'。
   - 最终,'outside' 和 'inside' 同时为 'true' 时,当前节点对称。

2. isSymmetric 函数:若 'root' 为空,直接返回 'true'。否则调用 'compare' 函数检查 'root' 左右子树的对称性。

 时间复杂度
时间复杂度为 \(O(n)\),其中 \(n\) 是树中节点的数量,因为每个节点会被访问一次。

 示例
对于输入 '[1, 2, 2, 3, 4, 4, 3]','isSymmetric' 函数会返回 'true',因为该树是对称的。

3.力扣104:二叉树的最大深度

题目描述:

定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

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

示例 2:

输入:root = [1,null,2]
输出:2

解答代码:

/**
 * 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 maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        
        // 后序遍历
        int leftsize = maxDepth(root->left);    // 左
        int rightsize = maxDepth(root->right);  // 右
        return max(leftsize, rightsize) + 1;    // 中
    }
};

代码逻辑:

代码实现了一个递归函数 'maxDepth' 来计算二叉树的最大深度。采用了后序遍历的方法,递归地计算每个节点左右子树的深度,并返回其中较大的值加一,作为当前节点的深度。以下是代码的逐步解释:

 代码讲解

'''cpp
class Solution {
public:
    int maxDepth(TreeNode root) {
        if (root == NULL) return 0;  // 如果节点为空,返回深度 0

        // 后序遍历
        int leftsize = maxDepth(root->left);    // 左:递归计算左子树的深度
        int rightsize = maxDepth(root->right);  // 右:递归计算右子树的深度
        return max(leftsize, rightsize) + 1;    // 中:选择左右子树较大值加1,表示当前节点的深度
    }
};
'''

 解释
1. 终止条件:当 'root == NULL',即遍历到叶子节点的下一层时,返回深度为 0。
2. 递归过程:依次递归计算左右子树的深度 'leftsize' 和 'rightsize'。
3. 返回值:每层递归返回左右子树深度中的最大值加 1,以得到该节点的深度。

 示例
对于以下二叉树:
'''
        3
       / \
      9   20
         /  \
        15   7
'''
调用 'maxDepth' 会输出 '3',因为该树的最大深度是 3。

4.力扣111:二叉树的最小深度

题目描述:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

示例 1:

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

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

解答代码:

/**
 * 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 minDepth(TreeNode* root) {
        if (root == NULL) return 0;

        // 后续遍历
        int leftheight = minDepth(root->left);      //左
        int rightheight = minDepth(root->right);    //右

        // 处理节点为空的情况
        if (root->left == NULL && root->right != NULL) 
        return rightheight + 1;
        if (root->right == NULL && root->left != NULL) 
        return leftheight + 1;

        int result  = min(leftheight, rightheight) + 1;
        return result;
    }
};

求最小深度的时候注意处理左节点或者右节点为空的情况

代码逻辑

代码定义了一个递归函数 'minDepth' 来计算二叉树的最小深度。它通过后序遍历的方式递归计算左右子树的最小深度,并处理了当某一子树为空时的特殊情况。

 代码说明
1. 边界条件:若 'root' 为空,则返回 '0',表示树的深度为 '0'。
2. 后序遍历:对左右子树分别调用 'minDepth' 函数计算其深度。
3. 处理单子树情况:当左子树或右子树为空时,只返回另一子树的深度 +1。
4. 返回最小深度:当左右子树都不为空时,返回左右子树深度的较小值加 '1'。

 时间复杂度
时间复杂度为 (O(n)),其中 (n) 是树中节点的数量,因为每个节点会被访问一次。

标签:right,TreeNode,int,随想录,Day14,打卡,root,节点,left
From: https://blog.csdn.net/jianbaigreat/article/details/143376231

相关文章

  • 代码随想录打卡Day18
    1.二叉搜索树的最小绝对差:题目描述给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。示例1:输入:root=[4,2,6,1,3]输出:1代码:/***Definitionforabinarytreenode.*structTree......
  • 代码随想录打卡Day17
    1.力扣954:最大二叉树:题目描述:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右......
  • 代码随想录打卡Day16
    1.力扣531:找树左下角的值。题目描述:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。示例1:输入:root=[2,1,3]输出:1示例2:输入:[1,2,3,4,null,5,6,null,null,7]输出:7解答代码:/***Defi......
  • 代码随想录算法训练营第十六天|leetcode513.找树左下角的值、leetcode112.路径总和、l
    1leetcode513.找树左下角的值题目链接:513.找树左下角的值-力扣(LeetCode)文章链接:代码随想录视频链接:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路:就是用一个东西存储result,使用后续遍历,如果遇到了最深的那一个值,就......
  • python+flask计算机毕业设计高校学生课堂考勤打卡APP的设计和实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校学生课堂考勤的研究,现有研究多集中在传统点名方式的改进以及基于单一技术的考勤系统开发。例如,有的研究专注于利用蓝牙技术实......
  • python+flask计算机毕业设计好骑行打卡园app系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容好骑行打卡园app系统毕业设计相关内容一、选题背景关于骑行打卡类APP的研究,现有研究主要以骑行记录和路线规划为主,专门针对骑行打卡园这种集打卡......
  • 代码随想录算法训练营第十四天|leetcode226. 翻转二叉树、leetcode101.对称二叉树、le
    1leetcode226.翻转二叉树题目链接:226.翻转二叉树-力扣(LeetCode)文章链接:代码随想录视频链接:听说一位巨佬面Google被拒了,因为没写出翻转二叉树|LeetCode:226.翻转二叉树哔哩哔哩bilibili自己的思路:之前想过就是使用层序遍历的方法来做这一道题目,后来感觉有一些行不通,就......
  • 代码随想录算法训练营第十三天|二叉树的理论基础、二叉树的递归遍历、二叉树的层序遍
    1二叉树的理论基础文章链接:代码随想录视频链接:关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序哔哩哔哩bilibili1.1二叉树的种类满二叉树所有节点处的值都排满了,没有空的完全二叉树只有在最后......
  • 代码随想录之哈希表刷题总结
    1.哈希表理论基础哈希表-(hashtable),数组其实就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。如下图:1.1哈希函数把学生的姓名直接映射为哈希表上的索引,然后就可以通过查询索引下标快速知道这位同学是否在这所学校里了。哈希函数如下图......
  • 考研打卡(9)
    开局(9)开始时间 2024-11-0513:57:18结束时间 2024-11-05 14:26:41今天要去打剧本杀数据结构将一个n*n的对称矩阵A的下三角按行存放在一堆数组B中,A[0][0]存放在B[0][0]中,那么第i行的对角元素A[i][i]在B中的存放位置是____(湖南大学2012)A(i+3)*i/2B(i+1)*i/2C(2......