题目:输入两棵二叉树A和B,判断B是不是A的子结构。
#include<iostream>
using namespace std;
struct BinaryTreeNode {
double m_dbValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
bool DoesTree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2);
bool Equal(double num1, double num2);
//1.在树1中找到一个与树2根节点相同的节点
bool HasSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) {
//一个树或两个树为空 均返回false
bool res = false;
if (pRoot1 != nullptr && pRoot2 != nullptr) {
if (Equal(pRoot1->m_dbValue, pRoot2->m_dbValue)) {
res = DoesTree1HasTree2(pRoot1, pRoot2);
}
if (!res) {
res = HasSubtree(pRoot1->m_pLeft, pRoot2);
}
if (!res) {
res = HasSubtree(pRoot1->m_pRight, pRoot2);
}
}
return res;
}
//2.判断树1中的该节点是否有包含树2
bool DoesTree1HasTree2(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) {
if (pRoot2 == nullptr) {
return true;
}
if (pRoot1 == nullptr) {
return false;
}
if (!Equal(pRoot1->m_dbValue, pRoot2->m_dbValue)) {
return false;
}
return DoesTree1HasTree2(pRoot1->m_pLeft, pRoot2->m_pLeft) && DoesTree1HasTree2(pRoot1->m_pRight, pRoot2->m_pRight);
}
bool Equal(double num1, double num2) {
if (abs(num1 - num2) < 0.0000001) {
return true;
}
else {
return false;
}
}
//=================
BinaryTreeNode* CreateBinaryTreeNode(double dbValue)
{
BinaryTreeNode* pNode = new BinaryTreeNode();
pNode->m_dbValue = dbValue;
pNode->m_pLeft = nullptr;
pNode->m_pRight = nullptr;
return pNode;
}
void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
if (pParent != nullptr)
{
pParent->m_pLeft = pLeft;
pParent->m_pRight = pRight;
}
}
void DestroyTree(BinaryTreeNode* pRoot)
{
if (pRoot != nullptr)
{
BinaryTreeNode* pLeft = pRoot->m_pLeft;
BinaryTreeNode* pRight = pRoot->m_pRight;
delete pRoot;
pRoot = nullptr;
DestroyTree(pLeft);
DestroyTree(pRight);
}
}
int main() {
BinaryTreeNode* pNodeA1 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNodeA2 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNodeA3 = CreateBinaryTreeNode(7);
BinaryTreeNode* pNodeA4 = CreateBinaryTreeNode(9);
BinaryTreeNode* pNodeA5 = CreateBinaryTreeNode(2);
BinaryTreeNode* pNodeA6 = CreateBinaryTreeNode(4);
BinaryTreeNode* pNodeA7 = CreateBinaryTreeNode(7);
ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3);
ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5);
ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7);
BinaryTreeNode* pNodeB1 = CreateBinaryTreeNode(8);
BinaryTreeNode* pNodeB2 = CreateBinaryTreeNode(9);
BinaryTreeNode* pNodeB3 = CreateBinaryTreeNode(2);
ConnectTreeNodes(pNodeB1, pNodeB2, pNodeB3);
//bool res = HasSubtree(pNodeA1, pNodeB1);
bool res = HasSubtree(nullptr, nullptr);
return 0;
}