C++,剑指Offer原书代码详解
树的子结构
http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88
先在树A中找到值为树B根节点的值的节点,然后判断这个节点的子树是否含有和树B一样的结构。
- 第一步中,查找与根节点值一样的节点,采用递归的方法来遍历树。
- 第二步中,同样采用递归的方法,判断判断当前对应节点是否相同,然后递归判断左、右节点,递归终止条件是到达了叶节点。
class Solution {
bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2){
if(pRoot2 == nullptr)
return true;
if(pRoot1 == nullptr)
return false;
if(!(pRoot1->val==pRoot2->val))
return false;
return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) &&
DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
}
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
bool result = false;
if(pRoot1 != nullptr && pRoot2 != nullptr)
{
if(pRoot1->val==pRoot2->val)
result = DoesTree1HaveTree2(pRoot1, pRoot2);
if(!result)
result = HasSubtree(pRoot1->left, pRoot2);
if(!result)
result = HasSubtree(pRoot1->right, pRoot2);
}
return result;
}
};