c/c++之对称的二叉树---测试用例

c/c++之对称的二叉树—测试用例

// 题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
分析:通常我们我们遍历树的算法为前序遍历,中序遍历,后序遍历。一般使用前序遍历(根左右)。如果我们定义一种先遍历根节点,然后遍历右节点,最后遍历左节点。如果前序遍历 == 新定义的遍历。那么则是对称。
在这里插入图片描述
第一个树:前序遍历:{8,6,5,7,6,7,5},自定义遍历{8,6,5,7,6,7,5} 这两种遍历相等。说明是对称的。
第二个树:前序遍历:{8,6,5,7,9,7,5},自定义遍历{8,9,5,7,6,7,5}这两种遍历不相等,说明不是对称。
第三个数可以将其空置位nullptr变成二叉树,遍历后也不是对称的。
代码如下:

bool isSymmetrical(BinaryTree* pNood)
{
	return isSymmetrical(pNood1, pNood2);
}

bool isSymmetrical(BinaryTree* pNood1, BinaryTree* pNood2)
{
	if(pNood1 == nullptr && pNood2 == nullptr)
	{
		return true;
	}
	if(pNood1 == nullptr || pNood2 == nullptr)
	{
		return false;
	}	
	if(pNood1->m_nValue != pNood2->m_nValue)
	{
		return false;
	}
	return isSymmetrical(pNood1->m_pLeft, pNood2->m_pRight)&& isSymmetrical(pNood1->m_pRight, pNood2->m_pLeft);
	
	
}


测试代码如下:

void test(const char* testname, BinaryTreeNode* pRoot,bool expected)
{
    if(testname != nullptr)
    {
        printf("the %s is Begin!\n", testname);
    }

    if( isSymmeterical(pRoot) == expected )
    {
        std::cout << "Passed"<<"\n";
    }
    else
    {
        std::cout << "Failed"<<"\n";
    }
    
}
//            8
//        6      6
//       5 7    7 5
void test1()
{
    
    BinaryTreeNode*pNode1 = CreateBinaryTreeNode(8);
    BinaryTreeNode*pNode2 = CreateBinaryTreeNode(6);
    BinaryTreeNode*pNode3 = CreateBinaryTreeNode(6);
    BinaryTreeNode*pNode4 = CreateBinaryTreeNode(5);
    BinaryTreeNode*pNode5 = CreateBinaryTreeNode(7);
    BinaryTreeNode*pNode6 = CreateBinaryTreeNode(7);
    BinaryTreeNode*pNode7 = CreateBinaryTreeNode(5);

    ConnectTreeNodes(pNode1, pNode2, pNode3);
    ConnectTreeNodes(pNode2, pNode4, pNode5);
    ConnectTreeNodes(pNode3, pNode6, pNode7);

    test("TESTONE", pNode1, true);

    DestroyTree(pNode1);

}
//            8
//        6      6
//       5 7    7
void test2()
{
    BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
    BinaryTreeNode* pNode61 = CreateBinaryTreeNode(6);
    BinaryTreeNode* pNode62 = CreateBinaryTreeNode(6);
    BinaryTreeNode* pNode51 = CreateBinaryTreeNode(5);
    BinaryTreeNode* pNode71 = CreateBinaryTreeNode(7);
    BinaryTreeNode* pNode72 = CreateBinaryTreeNode(7);

    ConnectTreeNodes(pNode8, pNode61, pNode62);
    ConnectTreeNodes(pNode61, pNode51, pNode71);
    ConnectTreeNodes(pNode62, pNode72, nullptr);

    test("TestTwo", pNode8, false);

    DestroyTree(pNode8);
}

// 没有结点
void test3()
{
    test("TestTree", nullptr, true);
}
int main(int argc, char const *argv[])
{
    test1();
    test2();
    test3();

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值