遇到一个编程题,当时没想出来,后面觉得很简单,很后悔,遗憾,记录一下。
定义一个二叉树的结构体
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每天刷题,剑来真的好看!