力扣第100题 第110题

每一个点开我的文章的小伙伴大家好!

在发这篇文章的时候,我是一名大二的学生,我将在博客记载我的学习之路!

这是我的第八篇博客文章,是关于最近刷力扣网站的一些好题和思路分享。

这次我要分享几题稍微进阶点的二叉树题目  有第100题 第110题 

先讲讲第100题:

先说一下大概思路:比较两棵树是否相同 得看他们每一次遍历出来的结果是否相同 

也就是说,只要有一次遍历出来的结果不一样,那就可以断定不是相同二叉树

我们要对可能出现的遍历的结果进行分析:

1.遍历的两个节点都没有左右子树,这个时候是符合结果相同的情况

2.遍历的两个节点,一个有右子树 一个没有右子树,或者一个有左子树,一个没有左子树

3.遍历的左右子树都有左右子树,但是左右子树节点内的值可能一样,可能不一样

以上就是一次遍历可能出现的情况,但是要对整棵树进行遍历的话,需要用到递归 而且是前序遍历

接下来结合代码分析,相信大家就会一目了然!

上代码!

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if(p==NULL&&q==NULL)   //结果1
    return true;
    else if(p==NULL||q==NULL)   //结果2
    return false;
    else if(p->val!=q->val)   //结果3 值不同
    return false;
    else {                  //结果3 值相同  这里隐含了递归“中”
        return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);  // “左”  “右”
          /*可以分开写成
        return isSameTree(p->left,q->left);
        return isSameTree(p->right,q->right);*/
    } 
}

接着就是第110题:

平衡二叉查找树:简称平衡二叉树。由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树,根据科学家的英文名也称为 AVL 树。它具有如下几个性质:

  1. 可以是空树。
  2. 假如不是空树,任何一个结点的左子树与右子树都是平衡二叉树,并且高度之差的绝对值不超过 1。

了解了什么是平衡二叉树后,我就来讲讲大体思路:

首先要用到递归,而且是后序遍历 顺序是左右中    判断是否是平衡二叉树,如果有一个节点的左右子树高度差大于一,那么整棵树就不是平衡二叉树,所以这里有一个条件就是(左子树高度-右子树高度)的绝对值不能大于一。   大于一我们就可以判断整棵树不是平衡二叉树,所以可以设置一个标志,这里我设置的标志是返回-1.

附上代码,搭配上文字讲解相信大家多看几次会明白

int Depth(struct TreeNode*root)
{
    if(root==NULL) return 0;
    int height;
    int leftheight=Depth(root->left);   //计算节点的左子树高度 
    if(leftheight==-1) return -1;
    int rightheight=Depth(root->right);  //计算节点右子树高度
    if(rightheight==-1) return-1;
    if(abs(leftheight-rightheight)>1)   //判断是否符合平衡二叉树的条件
    return -1;
    else {
        height=1+fmax(leftheight,rightheight);
    }
    return height;
}

bool isBalanced(struct TreeNode* root)
{
    int a=Depth(root);
    if(a==-1) return false;
    else return true;
}

leftheight  rightheight面对的对象会随着每一次递归而改变 

以leftheight举例子  第一次递归的时候,leftheight的对象是A   第二次递归时对象是B

这次的分享就到这里啦,如果有更好的思路欢迎提出,如有错误欢迎指出!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值