二叉树的相等比较

本文探讨了如何判断两棵二叉树是否相等的问题,关键在于所有节点的值对应相等。提供了递归和层次遍历(借助队列)两种不同的算法实现方式。
摘要由CSDN通过智能技术生成

当二叉树每个节点中的值对应相等时,二叉树相等,否则不相等。

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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值