题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
1. 分析
想到二叉树解题模板,先告诉根节点要怎么做,然后将左右子节点丢给递归即可。
本题是要求树的子结构,因为不知道是从母树的哪一个节点才开始子节点的根节点,所以用递归会更加好用。当找到第一个相同的节点之后,开始判断两棵树的每个节点的值是否相等,若相等且直到子树为空,那么是树的子结构,不然就继续递归,直到母树为空,判断不是子树。
2. 用C++写出逻辑:
// 递归调用的方法
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1 || !pRoot2)
return false;
return HasSubtree(pRoot1 -> left, pRoot2) || HasSubtree(pRoot1 -> right, pRoot2)
|| dfs(pRoot1, pRoot2);
}
// 实时判断两个节点是否相等,判断的函数
bool dfs(TreeNode* p1, TreeNode* p2){
if(!p2) return true;
if(!p1) return false;
return (p1 -> val == p2 -> val) && dfs(p1 -> left, p2 -> left)
&& dfs(p1 -> right, p2 -> right);
}
注:在 dfs函数中,有一个判断先后的问题,而返回结果恰好相反!故需要谨慎思考。这里,我们是要先判断子树是否递归完,若递归完所有节点且满足条件,则要返回true;然后再去判断母树是否递归完所有节点,若母树递归完了,则说明没有找到子结构,返回false。