LeetCode100(力扣100) :相同的树 C++ 多种思路

100.相同的树

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:       1         1
          / \       / \
         2   3     2   3
 
      [1,2,3],   [1,2,3]
输出: true

示例 2:

输入:      1          1
          /           \
         2             2

      [1,2],     [1,null,2]

输出: false

示例 3:

输入:       1         1
          / \       / \
         2   1     1   2

      [1,2,1],   [1,1,2]
      
输出: false
我提交的代码
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr) {
            return true;
        }
        if ((p == nullptr && q != nullptr) || (p != nullptr && q == nullptr)) {
            return false;
        }
        if (p->val == q->val) {
            return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
        }else{
            return false;
        }
    }
};

在这里插入图片描述

我的思想

当然是判断每个结点是否一样,如果每个结点都一样的话那就是相同的树。所以要遍历树,我使用递归来深度优先遍历树

情况:

​ 1.递归结束条件:当两棵树同时遍历结束——>结点同时为空

  1. 如果一个结点为空,一个结点不为空——两棵树肯定不一样的
  2. 结点值相等的时候,递归判断她们的左右结点又是否同时满足
我的代码优化
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr) return true;
        if (p == nullptr || q == nullptr)  return false;
        if (p->val == q->val) return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
        else  return false;
    }
};

噗,这还能叫优化?只是看起来简洁了一点而已啊。啧啧菜的离谱

 if (p == nullptr || q == nullptr) 
 if ((p == nullptr && q != nullptr) || (p != nullptr && q == nullptr))

这两句是一个意思,虽然使用 || 运算时,同时为1也能使得if条件为真,但是由于顺序执行,就轮不到 || 来执行同时为1的情况。所以只要p、q有一个为真时,就能返回false。

官方题解
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr && q == nullptr) {
            return true;
        } else if (p == nullptr || q == nullptr) {
            return false;
        } else if (p->val != q->val) {
            return false;
        } else {
            return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
        }
    }
};

在这里插入图片描述

我和官方思想是一样的,当情况相互对立的时候,使用else if减少情况判断,提高运行效率

其他优秀题解
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if (p == nullptr) return q == nullptr;
        return q != nullptr && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
    }
};

在这里插入图片描述

这个题解好666啊,把成立条件全部写在return 语句里,但是我很好奇怎么做到的减少了内存消耗?求大佬解答

我学会了
  1. 树的问题都是树的遍历问题,树的遍历问题就会用到递归。

    递归模板:

    void traverse(Tree root){
    	traverse(root.left);
    	traverse(root.right);
    }
    
  2. 在对立条件时候使用else if,别写一堆if降低了运行效率

  3. 在递归的时候,可以把成立的条件都写在return里使用&&运算,减少了if的判断

有不对的地方,可以改进的地方还望着大佬指出,谢谢呀!我真是太菜了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值