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