题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路
要查找树A中是否存在和树B结构一样的子树,我们可以分成两步:
Step1:在树A中找到和B的根结点的值一样的结点R;
Step2:判断树A中以R为根结点的子树是不是包含和树B一样的结构。
当在树A中找到与B的根节点的值相同的节点R,则跳到step2判断树A中以R为根结点的子树是不是包含和树B一样的结构,如果相同的话,则树A中存在于树B结构相同的子树;如果不相同的话,返回step1,继续遍历R的子树,寻找下一个和B的根结点的值一样的结点。
1、在树A中找到和B的根结点的值一样的结点R需要利用递归的思想,首先判断当前节点与B的根节点值是否相同,如果相同,则进入step2;如果不同,则分别判断当前节点的左子树、右子树与B的根节点值是否相同。
2、判断树A中以R为根结点的子树是不是包含和树B一样的结构
如果R节点的值和树B中的节点的值不同,则不是子结构;如果相同,递归去判断他们的各自的左孩子和右孩子是否相同。
递归的终止条件是到达了树A或者树B的叶子节点。
代码
/* 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) { if( pRoot2 == NULL || pRoot1 == NULL ) return false; if( pRoot1->val == pRoot2->val ) if( isSame(pRoot1,pRoot2) ) return true; if ( HasSubtree(pRoot1->left,pRoot2) ) return true; if ( HasSubtree(pRoot1->right,pRoot2) ) return true; return false; } bool isSame(TreeNode* pRoot1, TreeNode* pRoot2) { if( pRoot2 == NULL ) return true; if( pRoot1 == NULL ) return false; if( pRoot1->val != pRoot2->val ) return false; return isSame( pRoot1->left,pRoot2->left ) && isSame(pRoot1->right, pRoot2->right); } };