树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
给定的树 B:
返回 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
解题思路
算法流程
- 若A为空或B为空,返回false
- 在A中找到与B根节点值相同的节点
(1) 若A根节点与B根节点值相等,则转向步骤3判断两者的子树是否相等
if(A->val==B->val) res=doesAhaveB(A,B);
(2)若A根节点与B根节点值不相等,则从A的左子树继续找
if(!res) res=isSubStructure(A->left,B);
(3)若还没找到与B根节点相等的值,则继续从A的右子树开始找
if(!res) res=isSubStructure(A->right,B);
3.bool doesAhaveB(TreeNode* t1,TreeNode* t2)
若t2已经比对完了,则表示A包含B
if(!t2) return true;
若t2没比对完,t1却比对完了,则代表A不包含B
if(!t1) return false;
若t1中有值与t2值不等,则代表A不包含B
if(t1->val!=t2->val) return false;
若两树都还没有比对完,则继续比对两树的左右子树
return doesAhaveB(t1->left,t2->left) && doesAhaveB(t1->right,t2->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) {
//若A为空或B为空,返回false
if(!A || !B) return false;
bool res=false;
//在A中找到与B根节点值相同的节点
//若A根节点与B根节点值相等,则转向判断两者的子树是否相等
if(A->val==B->val) res=doesAhaveB(A,B);
//若A根节点与B根节点值不相等,则从A的左子树继续找
if(!res) res=isSubStructure(A->left,B);
//若还没找到与B根节点相等的值,则继续从A的右子树开始找
if(!res) res=isSubStructure(A->right,B);
return res;
}
bool doesAhaveB(TreeNode* t1,TreeNode* t2)
{
//若t2已经比对完了,则表示A包含B
if(!t2) return true;
//若t2没比对完,t1却比对完了,则代表A不包含B
if(!t1) return false;
//若t1中有值与t2值不等,则代表A不包含B
if(t1->val!=t2->val) return false;
//若两树都还没有比对完,则继续比对两树的左右子树
return doesAhaveB(t1->left,t2->left) && doesAhaveB(t1->right,t2->right);
}
};