一、题目描述
- 请书写一个函数,用来判断两棵树是否相等,如果相等返回true,否则返回其他值
二、解决方案
- 判断两棵树是否相等的规则是:
- 先判断两棵树的根节点的值是否相等
- 接着向下遍历,判断左右节点的值是否相等
- 例如,下面的两棵树是相等的
三、代码实现
- 实现函数如下:
- 进入之后首先判断两个节点是否都为空(返回true),是否会出现一个不为空另一个为空的情况(返回false)
- 接着再判断两个节点的值,然后再递归判断它们的左右子节点
typedef struct node
{
// 构造函数
node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }
// 节点数据以及左右子节点指针
int _data;
struct node* _left;
struct node* _right;
} Node;
bool compareTree(Node *tree1, Node *tree2)
{
// 如果两个节点都为空, 那么直接返回true即可
if(tree1 == NULL && tree2 == NULL)
return true;
// 如果上面的if没有执行, 可以确定至少有一个节点不为空
// 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
if(tree1 == NULL || tree2 == NULL)
return false;
// 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
// 如果两个节点的值不相等了, 直接返回true
if(tree1->_data == tree2->_data)
return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
else
return false;
}
四、测试
测试1
#include <iostream>
using namespace std;
typedef struct node
{
// 构造函数
node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }
// 节点数据以及左右子节点指针
int _data;
struct node* _left;
struct node* _right;
} Node;
bool compareTree(Node *tree1, Node *tree2)
{
// 如果两个节点都为空, 那么直接返回true即可
if(tree1 == NULL && tree2 == NULL)
return true;
// 如果上面的if没有执行, 可以确定至少有一个节点不为空
// 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
if(tree1 == NULL || tree2 == NULL)
return false;
// 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
// 如果两个节点的值不相等了, 直接返回true
if(tree1->_data == tree2->_data)
return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
else
return false;
}
int main()
{
// 构造A树
Node *aLeft = new Node(2, nullptr, nullptr);
Node *aRight = new Node(3, nullptr, nullptr);
node *rootA = new Node(1, aLeft, aRight);
// 构造B树
Node *bLeft = new Node(2, nullptr, nullptr);
Node *bRight = new Node(3, nullptr, nullptr);
node *rootB = new Node(1, bLeft, bRight);
// 判断两棵树是否相等
std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;
return 0;
}
测试2
#include <iostream>
using namespace std;
typedef struct node
{
// 构造函数
node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }
// 节点数据以及左右子节点指针
int _data;
struct node* _left;
struct node* _right;
} Node;
bool compareTree(Node *tree1, Node *tree2)
{
// 如果两个节点都为空, 那么直接返回true即可
if(tree1 == NULL && tree2 == NULL)
return true;
// 如果上面的if没有执行, 可以确定至少有一个节点不为空
// 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
if(tree1 == NULL || tree2 == NULL)
return false;
// 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
// 如果两个节点的值不相等了, 直接返回true
if(tree1->_data == tree2->_data)
return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
else
return false;
}
int main()
{
// 构造A树
Node *aLeft = new Node(2, nullptr, nullptr);
Node *aRight = new Node(3, nullptr, nullptr);
node *rootA = new Node(1, aLeft, aRight);
// 构造B树
Node *bLeft = new Node(2, nullptr, nullptr);
Node *bRight = new Node(3, nullptr, nullptr);
node *rootB = new Node(1, bLeft, bRight);
// 判断两棵树是否相等
std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;
return 0;
}
测试3
#include <iostream>
using namespace std;
typedef struct node
{
// 构造函数
node(int data, struct node* left, struct node* right): _data(data), _left(left), _right(right) { }
// 节点数据以及左右子节点指针
int _data;
struct node* _left;
struct node* _right;
} Node;
bool compareTree(Node *tree1, Node *tree2)
{
// 如果两个节点都为空, 那么直接返回true即可
if(tree1 == NULL && tree2 == NULL)
return true;
// 如果上面的if没有执行, 可以确定至少有一个节点不为空
// 如果出现一个节点为空, 另一个节点不为空, 说明两棵树不相等, 返回falase即可
if(tree1 == NULL || tree2 == NULL)
return false;
// 如果两个节点都为不空, 判断它们的节点值, 如果相等那么递归判断各自的左右子节点
// 如果两个节点的值不相等了, 直接返回true
if(tree1->_data == tree2->_data)
return compareTree(tree1->_left, tree2->_left) && compareTree(tree2->_right, tree2->_right);
else
return false;
}
int main()
{
// 构造A树
Node *aLeft = new Node(2, nullptr, nullptr);
Node *aRight = new Node(3, nullptr, nullptr);
node *rootA = new Node(1, aLeft, aRight);
// 构造B树
Node *bLeft = new Node(2, nullptr, nullptr);
Node *bRight = new Node(3, nullptr, nullptr);
node *rootB = new Node(1, bLeft, bRight);
// 判断两棵树是否相等
std::cout << boolalpha << compareTree(rootA, rootB) << std::endl;
return 0;
}