题目:
输入两棵二叉树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); } }