【LeetCode刷题记录】简单篇-100-相同的树

【题目描述】

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

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


【测试用例】

示例1:

        输入:p = [1,2,3],q = [1,2,3]

        输出:true

示例2

        输入:p = [1,2],q = [1,null,2]

        输出:false

示例3

        输入:p = [1,2,1], q = [1,1,2]

        输出:false


【思路分析】

两树相同,要求画出来的二叉树完全一样,即每个位置上的节点均相同。

我们先考虑极端情况,即两棵树均为空树,此时仍然认为两树相等,可以单独提出来做特殊处理。

其余的情况即非空树,而所有非空二叉树在遍历时候的一个共同点就是递归操作。(在上一篇博客中也提到过,二叉树的所有题目几乎都是在遍历的基础上进行操作的,而二叉树遍历最简单的方法就是递归)。所以要判断两棵树是否相同,实际上我们只需要考虑当前节点、左子树、右子树三个部分,而左右子树都是直接扔入递归,那么最后要考虑的就只有一个当前节点。两棵树的当前节点分别是p和q,只要其均不为空并且p->val和q->val相等,则可以断定p和q相等。(左右子树进行递归操作也是进行相同的判断)

总结一下,对于每次传入isSameTree函数的两棵树p和q,如果两棵树均为空,则直接返回true;否则需要判断其是否同时满足以下条件:①p和q均不为空;②p->val = q->val;③isSameTree(p->left, q->left)返回值为true;④isSameTree(p->right, q->right)返回值为true


【参考代码】

C实现

#include <stdio.h>

//easy-100-相同的树
bool isSameTree(struct TreeNode* p, struct TreeNode* q);

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
}; 

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

C++实现

#include <iostream>
using namespace std;

//easy-100-相同的树
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q);
}; 

bool Solution::isSameTree(TreeNode* p, TreeNode* q){
	if(NULL==p && NULL==q){
		return true;
	}
	return p!=NULL && q!=NULL && q->val==p->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值