题目:
树的子结构
链接:
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
分为两步:
第一步:用HasSubtree 搜索与子树根节点值相同的点(递归查找),如果找到则进行第二步。
第二步:用isSubtree搜索子树是否是大树的子树,
代码:
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/10 class Solution{11 public:12 bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){13 bool result = false;14 if(pRoot2 == nullptr)15 return false;16 if(pRoot1 == nullptr)17 return false;18 if(pRoot1->val == pRoot2->val){19 result = isSubtree(pRoot1,pRoot2);20 }21 if(!result){22 result = HasSubtree(pRoot1->left,pRoot2)|| HasSubtree(pRoot1->right, pRoot2);23 }24 return result;25 }26 bool isSubtree(TreeNode* root1, TreeNode* root2){27 if(root2 == nullptr)28 return true;29 if(root1 == nullptr)30 return false;31 if(root1->val != root2->val)32 return false;33 else34 return isSubtree(root1->left,root2->left)&& isSubtree(root1->right,root2->right);35 }36 };