输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:
0 <= 节点个数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
总体的思路是对整个树进行先序遍历,在遍历的过程中在当前节点开始向下与对比的树进行比较,算法具体流程如下:
- 对A树进行先序遍历,遍历过程中进行与B树的对比;
- 与B树的对比也采用递归的方式,分别判断当前节点的值、左子树的值与右子树的值是否全都相等,相等则返回true
- 先序遍历之后,将A树的指针分别递归到左子树和右子树,这样可遍历全部的节点,当前比较,递归左子树,递归右子树三个结果的或即可。
值得注意的是,在递归的过程中无论是判断函数或是先序遍历的递归都需要注意边界值的问题
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(!B)return false;
if(!A)return false;
if(helper(A,B))return true;
if(isSubStructure(A->left,B))return true;
if(isSubStructure(A->right,B))return true;
return false;
}
bool helper(TreeNode* a,TreeNode* b)
{
if(!b)return true;
if(!a)return false;
if(a->val==b->val)
{
return helper(a->left,b->left)&&helper(a->right,b->right);
}
return false;
}
};