/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
}
题目的意思是在整棵二叉树中寻找特定的子树(局部相等)
检查是否包含subroot,即寻找相同的子树,因此可以直接调用文章的代码,如下
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p==NULL && q==NULL)
return true;
//若能执行到此,排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL
if ((p==NULL)+(q==NULL)==1)
return false;
//只剩下最后一种情况:p和q都不为NULL
if (p->val!=q->val)
return false;
//执行到此处,说明p->val和q->val相等
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
现在的问题转化为如何设计isSubtree函数使其能合理调用isSameTree函数
由于subRoot肯定不为空树,因此上来先判断root==NULL
if(root==NULL)
return false;
除去了这种情况,剩下root!=NULL,把每个节点视作根去寻找子树,判断子树是否相等
可以判断isSameTree(root,sunRoot)的返回值,再进一步操作
if (isSameTree(root,subRoot))
return true;
如果上方函数的返回值为false,情况有两种:1.完全找不到符合subRoot的子树 2.不是要找的子树,需要进一步查找(root->left和root->right)
注意:只要左右子树有一个符合要求就可以,因此用或(||)连接
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
递归展开图(只画isSameTree),以下面这个二叉树为例说明
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
if (p==NULL && q==NULL)
return true;
//若能执行到此,排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL
if ((p==NULL)+(q==NULL)==1)
return false;
//只剩下最后一种情况:p和q都不为NULL
if (p->val!=q->val)
return false;
//执行到此处,说明p->val和q->val相等
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
if (root==NULL)
return false;
if (isSameTree(root,subRoot))
return true;
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
因篇幅问题不能全部显示,请点此查看更多更全内容