题目:
树的子结构
链接:
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 else 34 return isSubtree(root1->left,root2->left)&& isSubtree(root1->right,root2->right); 35 } 36 };