从树中递归找到与需要配对的根节点相同的节点,然后就往下遍历,如果判断不相等,则继续寻找
#include<iostream>
struct treeNode
{
int m_nValue;
treeNode* pLfet, * pRight;
treeNode(int _Value) :m_nValue(_Value), pLfet(nullptr), pRight(nullptr){}
};
bool HasSubTree(treeNode* node1, treeNode* node2)
{
bool result = false;
if (node1 != nullptr && node2 != nullptr)
{
if (node1->m_nValue == node2->m_nValue)//找到与node2根节点一样的子节点
result = DoesTree1HaveTree2(node1, node2);//找到与根节点一样的话就往下遍历
if (!result)
HasSubTree(node1->pLfet, node2);//往左边找与根节点相同的
if (!result)
HasSubTree(node1->pRight, node2);//往右边找与根节点相同的
}
return result;
}
bool DoesTree1HaveTree2(treeNode* node1, treeNode* node2)
{
if (node2 == nullptr)return true;//如果需要配对的节点遇到了空,则判断到底
if (node1 == nullptr)return false;
if (node1->m_nValue != node2->m_nValue)
return false;
return DoesTree1HaveTree2(node1->pLfet, node2->pLfet) && (node1->pRight, node2->pRight);//当左边和右边同时都满足时,就返回true
}