判断两棵树是否相等或者为镜像树

遇到一个编程题,当时没想出来,后面觉得很简单,很后悔,遗憾,记录一下。
定义一个二叉树的结构体

struct TreeNode
{
    int value;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):value(x),left(nullptr),right(nullptr){}
};

需要判断两课树是否相等(包括镜像树)
镜像树举例:这两颗树也代表相等

     Example usage
     Constructing two trees
     Tree 1:       1
                 /   \
                2     3
               / \   / \
              4   5 6   7
    
     Tree 2:       1
                 /   \
                3     2
               / \   / \
              6   7 4   5
    // These trees should be considered identical by the function

函数实现

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

没错,就是这么简单,后悔第一遍没做出来!
验证

#include "iostream"
#include <cstddef>
#include <type_traits>

struct treeNode
{
    int value;
    treeNode* left;
    treeNode* right;
    treeNode(int x):value(x),left(NULL),right(NULL){}
};

bool isSameTree(treeNode* p, treeNode* q)
{
    if(p == nullptr && q ==nullptr)
    {
        return true;
    } else if(p == nullptr|| q==nullptr)
    {
        return false;
    } else if(p->value != q->value)
    {
	    return false;
	}
	
    return ((isSameTree(p->left, q->left) && isSameTree(p->right, q->right)) 
    ||(isSameTree(p->left, q->right) && isSameTree(p->left, q->right)));
}
int main()
{
    treeNode* root1 = new treeNode(1);
    root1->left = new treeNode(2);
    root1->right = new treeNode(3);
    root1->left->left = new treeNode(4);
    root1->left->right = new treeNode(5);
    root1->right->left = new treeNode(6);
    root1->right->right = new treeNode(7);

    treeNode* root2 = new treeNode(1);
    root2->left = new treeNode(3);
    root2->right = new treeNode(2);
    root2->left->left = new treeNode(6);
    root2->left->right = new treeNode(7);
    root2->right->left = new treeNode(4);
    root2->right->right = new treeNode(5);

    isSameTree(root1, root2);

    std::cout << "Are the trees identical considering left-right swaps? " 
         << (isSameTree(root1, root2) ? "Yes" : "No") << std::endl;
    delete root1->left->left;
    delete root1->left->right;
    delete root1->right->left;
    delete root1->right->right;
    delete root1->left;
    delete root1->right;
    delete root1;

    delete root2->left->left;
    delete root2->left->right;
    delete root2->right->left;
    delete root2->right->right;
    delete root2->left;
    delete root2->right;
    delete root2;
}
``立个flag每天刷题,剑来真的好看!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值