当二叉树每个节点中的值对应相等时,二叉树相等,否则不相等。
struct BTreeNode
{
int v;
BTreeNode* left;
BTreeNode* right;
};
函数原型:
bool BTreeCompare(BTreeNode* b1, BTreeNode* b2);
两种实现方式:递归实现和利用层次遍历的方法实现。层次遍历要借助队列实现。
#include <iostream>
#include <list>
using namespace std;
struct BTreeNode
{
int v;
BTreeNode* left;
BTreeNode* right;
};
bool BTreeCompare(BTreeNode* b1, BTreeNode* b2)
{
bool ret = true;
/*两个结点都存在*/
if( ret && b1 != NULL && b2 != NULL)
{
if(b1->v == b2->v)
{
/*分别遍历比较左右子树*/
ret = ret && BTreeCompare(b1->left, b2->left) && BTreeCompare(b1->right, b2->right);
}
else
{
ret = false;
}
}
else if( ret && b1 == NULL && b2 == NULL) //某处结点为空或到达叶子结点的子树
{
ret = true;
}
else
{
ret = false;
}
return ret;
}
bool BTreeCompareEX(BTreeNode* b1, BTreeNode* b2)
{
bool ret = true;
list<BTreeNode*> list1;
list<BTreeNode*> list2;
list1.push_back(b1);
list2.push_back(b2);
while(ret && list1.size() > 0 && list2.size() > 0)
{
BTreeNode* node1 = list1.front();
BTreeNode* node2 = list2.front();
list1.pop_front();
list2.pop_front();
if(ret && node1 != NULL && node2 != NULL)
{
if(node1->v == node2->v)
{
list1.push_back(node1->left);
list1.push_back(node1->right);
list2.push_back(node2->left);
list2.push_back(node2->right);
}
else
{
ret = false;
}
}
else if(ret && node1 == NULL && node2 == NULL)
{
ret = true;
}
else
{
ret = false;
}
}
return ret;
}
int main()
{
BTreeNode n1[10] = {0};
BTreeNode n2[10] = {0};
for(int i=0; i<10; i++)
{
n1[i].v = i;
n2[i].v = i;
}
n1[0].left = &n1[1];
n1[0].right = &n1[2];
n1[1].left = &n1[3];
n1[1].right = &n1[4];
// n1[2].left = &n1[5];
n1[2].right = &n1[6];
//n1[3].left = &n1[7];
n1[3].right = &n1[8];
n1[4].left = &n1[9];
n2[0].left = &n2[1];
n2[0].right = &n2[2];
n2[1].left = &n2[3];
n2[1].right = &n2[4];
// n2[2].left = &n2[5];
n2[2].right = &n2[6];
// n2[3].left = &n2[7];
n2[3].right = &n2[8];
n2[4].left = &n2[9];
//n2[4].right = &n2[9];
//n2[4].v = 23;
cout<<BTreeCompare(n1, n2)<<endl;
cout<<BTreeCompareEX(n1, n2)<<endl;
return 0;
}