力扣刷题:二叉树OJ篇(上)

大家好,这里是小编的博客频道

小编的博客:就爱学编程
很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录


废话不多说,我们直接看题。

1.单值二叉树

(1)题目描述


(2)解题思路

  • 简单递归一一比较就行就行。

代码实现:

c 复制代码
bool isUnivalTree(struct TreeNode* root) {
    if(NULL == root) return true;
    else if(root->left && root->val != root->left->val) return false;
    else if(root->right && root->val != root->right->val) return false;
    else return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.二叉树的最大深度

(1)题目描述


(2)解题思路

  • 如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)+1。而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

代码实现:

c 复制代码
int maxDepth(struct TreeNode* root) {
    if(root == NULL) return 0;
    int leftheight = maxDepth(root->left);
    int rightheight = maxDepth(root->right);
    return ((leftheight > rightheight ? leftheight : rightheight) + 1);
}

3.翻转二叉树

(1)题目描述


(2)解题思路

  • 这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。如果当前遍历到的节点 root 的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root 为根节点的整棵子树的翻转。

代码实现:

c 复制代码
struct TreeNode* invertTree(struct TreeNode* root) {
    if(root == NULL) return NULL;
    struct TreeNode* temp = root->left;
    root->left = root->right;
    root->right = temp;
    invertTree(root->left);
    invertTree(root->right);
    return root;
}

4.相同的数

(1)题目描述


(2)解题思路

  • 如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
  • 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

代码实现:

c 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
   if (p == NULL && q == NULL) {
        return true;
    } else if (p == NULL || q == NULL) {
        return false;
    } else if (p->val != q->val) {
        return false;
    } else {
        return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
}
    

快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

相关推荐
Joyner201810 分钟前
python-leetcode-定长子串中元音的最大数目
算法·leetcode·职场和发展
Tisfy13 分钟前
LeetCode 2272.最大波动的子字符串:转为多次的最大子数组和 - 一步步思考推导
算法·leetcode·动态规划·字符串·题解
查理零世24 分钟前
【算法】 区间合并(附蓝桥杯真题) python
python·算法·蓝桥杯
Codingwiz_Joy41 分钟前
Day09 -实例:拿到加密密文进行解密
算法·安全·安全性测试
float_六七1 小时前
双指针算法
算法
BingLin-Liu1 小时前
图论之cruskal算法(克鲁斯卡尔)
数据结构·算法·图论
进取星辰2 小时前
PyTorch 深度学习实战(15):Twin Delayed DDPG (TD3) 算法
pytorch·深度学习·算法
strive-debug2 小时前
C语言之 条件编译和预处理指令
算法
Sacuki2 小时前
BP神经网络公式推导与代码实现
算法
山登绝顶我为峰 3(^v^)33 小时前
VSCode + CMake
ide·vscode·算法·计算机·编辑器