剑指offer26_树的子结构
基本思路是利用递归
1.创建一个辅助函数判断两棵树是否相等
2.递归遍历A树的每一个节点作为根结点和B树进行比较
isSubStructure函数的返回值,若树 B 是树 A 的子结构,则必满足以下三种情况之一:
以 节点 A 为根节点的子树 包含树 B ,对应 hasSubStructure(A, B);
树 B 是 树 A 左子树 的子结构,对应 isSubStructure(A.left, B);
树 B 是 树 A 右子树 的子结构,对应 isSubStructure(A.right, B);
hasSubStructure函数的终止条件:
当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true ;
当节点 A 为空:说明已经越过树 A 叶子节点,即匹配失败,返回 false ;
当节点 A 和 B 的值不同:说明匹配失败,返回 false ;
返回值:
判断 A 和 B 的左子节点是否相等,即 hasSubStructure(A.left, B.left) ;
判断 A 和 B 的右子节点是否相等,即 hasSubStructure(A.right, B.right)
/**
* 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(A == NULL || B == NULL)
{
return false;
}
return hasSubStructure(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
bool hasSubStructure(TreeNode *A, TreeNode *B)
{
if(B == NULL)
{
return true;
}
if(A == NULL)
{
return false;
}
if(A->val != B->val)
{
return false;
}
return hasSubStructure(A->left, B->left) && hasSubStructure(A->right, B->right);
}
};