剑指Offer-17.树的子结构(C++/Java)

时间:2023-03-09 04:59:30
剑指Offer-17.树的子结构(C++/Java)

题目:

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

分析:

注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构。

判断的时候我们要从A树的根节点开始判断B是不是A的结构,递归依次判断B是不是A的左子树和右子树的子结构。

在子结构的判断上,也就是从两个根节点开始判断是否相同,然后递归判断左右节点的val是否相同,当出现B中节点为null的时候,返回true。A中节点为null时,返回false,节点不相同也返回false,多个结果取与。

程序:

C++

class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool res = false;
if(pRoot1 != nullptr && pRoot2 != nullptr){
res = helper(pRoot1, pRoot2);
if(!res)
res = HasSubtree(pRoot1->left, pRoot2);
if(!res)
res = HasSubtree(pRoot1->right, pRoot2);
}
return res;
}
bool helper(TreeNode* p1, TreeNode* p2){
if(p2 == nullptr)
return true;
else if(p1 == nullptr)
return false;
else if(p1->val != p2->val)
return false;
else
return helper(p1->left, p2->left) && helper(p1->right, p2->right);
}
};

Java

public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null)
return false;
/*boolean result = false;
result = helper(root1, root2);
if(!result)
result = HasSubtree(root1.left, root2);
if(!result)
result = HasSubtree(root1.right, root2);
return result;*/
return helper(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
}
public boolean helper(TreeNode root1,TreeNode root2){
if(root2 == null)
return true;
if(root1 == null)
return false;
if(root1.val != root2.val)
return false;
return helper(root1.left, root2.left) && helper(root1.right, root2.right);
}
}