正餐---二叉树的OJ题


目录​​​​​​​

前言🍯

1. 检查两颗树是否相同🥇

1.1 思路分析🪙

1.2 代码实现🧰

2. 单值二叉树🌲

2.1 思路分析🔮

2.2 代码实现💈

3. 二叉树的前序遍历🎟️

3.1 思路分析🕰️

3.2 代码实现💸

4. 翻转二叉树🏎️

4.1 思路分析💷

4.2 代码实现🛠️

5. 另一颗树的子树🚂

5.1 思路分析🛡️

5.2 代码实现🎐

 6.二叉树的构建及遍历🚃

7. 对称二叉树🚧

7.1 思路分析🧧

7.2 代码实现📆

8. 判断一颗二叉树是否是平衡二叉树🚦

8.1 思路分析🎁

8.2 代码实现🛍️

课后作业🍭

1.二叉树的后序遍历🩸

2.二叉树的中序遍历💎

 3. 二叉树最大深度🍩

3.1 思路分析

后语🍰


前言🍯

Hey,guys!又见面了,还记得上篇博客,我们干了什么吗?没错👍,我们对二叉树和堆排序相关的知识点进行了巩固复习。今天,我们的主要任务就是对递归有更深的理解,可以更好地运用递归的思想。今天主要就是二叉树的oj题。

废话不多说,我们进行今天的学习!!!


1. 检查两颗树是否相同🥇

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1.1 思路分析🪙


1.2 代码实现🧰

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)//都空
        return true;
    if(p==NULL||q==NULL)//一个空
        return false;
    //到这就都不空
    if(p->val==q->val)
        return isSameTree(p->left,q->left)&&
        isSameTree(p->right,q->right);//2个都相同才返回true
    else//不相同
        return false;    
}

2. 单值二叉树🌲

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.1 思路分析🔮


2.2 代码实现💈

 bool isSameNode(struct TreeNode* root,int data)
 {
     if(root==NULL)
         return true;
     if(root->val!=data)
         return false;
     return isSameNode(root->left,data)&&
     isSameNode(root->right,data);//左右都要比较(每个节点都要比较)
 }
bool isUnivalTree(struct TreeNode* root) {
    int data=root->val;
    return isSameNode(root,data);
}

3. 二叉树的前序遍历🎟️

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

3.1 思路分析🕰️

此题需要保存节点,所以需要先获取节点个数,然后进行前序遍历,保存每一个节点值。

这也是为什么要有这道题,前序遍历的实现之前见过了,忘记的小伙伴再去看看吧。

3.2 代码实现💸

 //节点个数 = 左右子树节点个数 + 1
 int BzSize(struct TreeNode* root)
 {
     if(root==NULL)
         return 0;
     return BzSize(root->left)+BzSize(root->right)+1;
 }
 //前序遍历+保存
void ProeOrder(struct TreeNode* root,int* a,int* pi)
{
    if(root)
    {
         a[(*pi)++]=root->val;
         ProeOrder(root->left,a,pi);
         ProeOrder(root->right,a,pi);
    }
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int* a,i=0;
    *returnSize=BzSize(root);
    a=(int*)malloc(sizeof(int)*(*returnSize));
    ProeOrder(root,a,&i);
    return a;
}

4. 翻转二叉树🏎️

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

4.1 思路分析💷


4.2 代码实现🛠️

 void ChangeNode(struct TreeNode* root)
{
    if(root==NULL)
        return;
    struct TreeNode* tmp=root->left;
    root->left=root->right;
    root->right=tmp;
    //每一个节点都要交换
    ChangeNode(root->left);
    ChangeNode(root->right);
}
struct TreeNode* invertTree(struct TreeNode* root) {
    ChangeNode(root);
    return root;
}

5. 另一颗树的子树🚂

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

5.1 思路分析🛡️


5.2 代码实现🎐

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

bool isSubtree(struct TreeNode* s, struct TreeNode* t){     
    if(s == NULL)
        return false;
    //根相同,判断当前这个树是否和t相同
    if(isSameTree(s, t))
        return true;
    return isSubtree(s->left, t)
            || isSubtree(s->right, t);
}

 6.二叉树的构建及遍历🚃

​​​​​​二叉树遍历_牛客题霸_牛客网

#include <stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
    char* val;
    struct TreeNode* left;
    struct TreeNode* right;
}TNode;
//创建二叉树
TNode* CreateTree(char* str,int* pi)
{
    if(str[*pi]!='#'){
         //当前节点非空,则创建当前节点
         TNode* root=(TNode*)malloc(sizeof(TNode));
         root->val=str[(*pi)++];
         //创建左子树
         root->left=CreateTree(str,pi);
         (*pi)++;
         //创建右子树
         root->right=CreateTree(str,pi);
         return root;
    }
    else {
        return NULL;
    }
}
//中序遍历
void InOrder(TNode* root){
    if(root==NULL)
        return;
    InOrder(root->left);
    printf("%c ",root->val);
    InOrder(root->right);
}
int main() {
    char str[101];
    int i=0;
    //读入字符串
    scanf("%s",str);
    //创建二叉树
    TNode* root=CreateTree(str,&i);
    //中序遍历输出
    InOrder(root);
    return 0;
}

7. 对称二叉树🚧

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

7.1 思路分析🧧


7.2 代码实现📆

bool _isSymmetric(struct TreeNode* left,struct TreeNode* right){
    if(left==NULL&&right==NULL)
        return true;
    if(left==NULL||right==NULL)
        return false;
    if(left->val==right->val)
        return _isSymmetric(left->left,right->right)
        &&_isSymmetric(left->right,right->left);
    else
        return false;
}
bool isSymmetric(struct TreeNode* root) {
   return _isSymmetric(root->left,root->right);
}

8. 判断一颗二叉树是否是平衡二叉树🚦

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

8.1 思路分析🎁


8.2 代码实现🛍️

 int TreeHight(struct TreeNode* root){
     return root==NULL?0:
     fmax(TreeHight(root->left),TreeHight(root->right))+1;
 }
 bool _isBalanced(struct TreeNode* root){
     if(root==NULL)
         return true;
     int h1=TreeHight(root->left);
     int h2=TreeHight(root->right);
     if(abs(h1-h2)>1)
         return false;
     return _isBalanced(root->left)&&
     _isBalanced(root->right);
 }
bool isBalanced(struct TreeNode* root) {
    if(root==NULL)
        return true;
    return _isBalanced(root);
}

----课后作业🍭

1.二叉树的后序遍历🩸

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2.二叉树的中序遍历💎

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 3. 二叉树最大深度🍩

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

3.1 思路分析

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

可以理解就是求高度h


后语🍰

本次我们完成了一些二叉树的oj练习题,我也给大家留了一些课后作业,有需要的小伙伴可以自己点击链接去练习,希望今天的题目让大家对递归有了更好的运用!!!

下一篇博客,我们将一起学习排序的相关知识点!请大家多多期待🙏


本次的分享到这里就结束了!!

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!期待大家的互动!!!

公主/王子殿下,请给我点赞👍+收藏⭐️+关注➕(这对我真的很重要!!!

  • 60
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值