当前位置: 首页 > article >正文

二叉树习题

文章目录

  • 1.单值二叉树
  • 2.相同的树
  • 3.对称二叉树
  • 3.二叉树的最大深度

1.单值二叉树

在这里插入图片描述

bool isUnivalTree(struct TreeNode* root)
{
    if(root==NULL)//判空 如果root为空指针那么也就是说比较结束了,所以返回true
    {
        return true;
    }
    if(root->left&&root->left->val!=root->val)
    //判断root->left不为空并且值不相等返回false
    {
        return false;
    }
    if(root->right&&root->right->val!=root->val)
    //同上
    {
        return false;
    }
    return isUnivalTree(root->right)&&isUnivalTree(root->left);
    //若左右孩子有一个值为false则整个函数结果返回false
}

2.相同的树

在这里插入图片描述

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    if(p==NULL&&q==NULL)//如果两个节点都同时为空则意味着走到尾了,完全相同
    {
        return true;
    }
   
    else if(p==NULL||q==NULL)//反之排除上面的情况如果有一个节点为空则返回false
    {
        return false;
    }
    if(p->val!=q->val)//递归要写判定结束条件,不相等返回false
    {
        return false;
    }
  
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
    //若有一个不成立则返回false
}

3.对称二叉树

在这里插入图片描述
这道题的话就转载一段话吧 出自这道题的评论区,我的解法和上道题有异曲同工之妙

递归的难点在于:找到可以递归的点 为什么很多人觉得递归一看就会,一写就废。 或者说是自己写无法写出来,关键就是你对递归理解的深不深。

对于此题: 递归的点怎么找?从拿到题的第一时间开始,思路如下:

1.怎么判断一棵树是不是对称二叉树? 答案:如果所给根节点,为空,那么是对称。如果不为空的话,当他的左子树与右子树对称时,他对称

2.那么怎么知道左子树与右子树对不对称呢?在这我直接叫为左树和右树 答案:如果左树的左孩子与右树的右孩子对称,左树的右孩子与右树的左孩子对称,那么这个左树和右树就对称。

仔细读这句话,是不是有点绕?怎么感觉有一个功能A我想实现,但我去实现A的时候又要用到A实现后的功能呢?

当你思考到这里的时候,递归点已经出现了: 递归点:我在尝试判断左树与右树对称的条件时,发现其跟两树的孩子的对称情况有关系。

想到这里,你不必有太多疑问,上手去按思路写代码,函数A(左树,右树)功能是返回是否对称

def 函数A(左树,右树): 左树节点值等于右树节点值 且
函数A(左树的左子树,右树的右子树),函数A(左树的右子树,右树的左子树)均为真 才返回真

实现完毕。。。

写着写着。。。你就发现你写出来了。。。。。。

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

    }
    return issame(p->left,q->right)&&issame(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root){
    return issame(root,root);

}

3.二叉树的最大深度

在这里插入图片描述

int maxDepth(struct TreeNode* root){
    if(root==NULL)
    {
        return 0;
    }
    int leftdeep=maxDepth(root->left);
    int rightdeep=maxDepth(root->right);
    return leftdeep>rightdeep? leftdeep+1:rightdeep+1;

}

http://www.kler.cn/a/323.html

相关文章:

  • C#运动控制系统:雷赛控制卡实用完整例子 C#雷赛开发快速入门 C#雷赛运动控制系统实战例子 C#快速开发雷赛控制卡
  • 计算机网络 (12)物理层下面的传输媒体
  • 六十:HTTP/2与gRPC框架
  • 【RabbitMQ高级篇】消息可靠性问题(1)
  • Bert中文文本分类
  • PCA降维MATLAB代码解释及应用场景
  • 【蓝桥杯-筑基篇】常用API 运用(1)
  • 【c++】继承
  • 自学大数据第六天~HDFS命令(一)
  • Linux基础命令大全(下)
  • python+django+vue图书个性化推荐系统
  • Vue3之父子组件通过事件通信
  • 高速PCB设计指南系列(四)
  • Java for循环嵌套for循环,你需要懂的代码性能优化技巧
  • 常见的HTTP状态码
  • HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?
  • 滑动窗口算法
  • CentOS定时任务——crontab
  • Vue 3.0 单文件组件 【Vue3 从零开始】
  • 猿人学爬虫第1题- js混滑–源码乱码
  • SpringBoot:SpringBoot 的底层运行原理解析
  • TCP/IP协议
  • 【电赛MSP430系列】GPIO、LED、按键、时钟、中断、串口、定时器、PWM、ADC
  • 马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?
  • 【数据结构】链表OJ
  • R语言编程基础