题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
数据范围:
0 <= A的节点个数 <= 10000
0 <= B的节点个数 <= 10000
示例:
输入:
{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
返回值:
true
解题思路:
本题考察数据结构树的使用。先定义一个辅助函数check用来检查结构是否一致,如果p2结点为空返回true,p1结点为空则返回false,这是因为p1要包含p2,除了判断根节点的值是否一致,还要分别判断p1和p2的左子树和右子树;HasSubtree函数是该问题的主功能函数,判断树pRoot2是否在树pRoot1内,只有当根节点的值一致时,执行check函数,进行结构一致性的判断,若值不一致,再依次取pRoot1的左树和右树进行判断,直到遍历完pRoot1的所有结点,过程中如果找到pRoot2的结构,则flag置为true,完毕。
测试代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool flag=false; if(pRoot1!=nullptr&&pRoot2!=nullptr) { if(pRoot1->val==pRoot2->val) flag=check(pRoot1,pRoot2); if(!flag) flag=HasSubtree(pRoot1->left,pRoot2); if(!flag) flag=HasSubtree(pRoot1->right,pRoot2); } return flag; } // 检查结构是否一致 bool check(TreeNode *p1,TreeNode *p2){ if(p2==nullptr) return true; if(p1==nullptr) return false; if(p1->val!=p2->val) return false; // 检查左子树和右子树是否均一致 return check(p1->left,p2->left)&&check(p1->right,p2->right); } };
