题目:输入两个二叉树A和B的根节点,判断二叉树B是否为A的子结构
分析:
1. 两个二叉树如下所示
A树 B树
2. 要查找树A中是否包含数B一样的子结构,我们可以分成两步。
(1)第一步:先在树A中找到和树B的根节点的值一样的结点
(2)第二步:判断从A中找到的和树B根节点的值一样的结点是否包含树B一样的结构
3. 例如上面的两颗子树中,树A中总共有两个值为8的结点,因为我们要判断两次是否B为A的子结构。
代码:
//二叉树结点
struct BinaryTreeNode{
int value;
BinaryTreeNode *lsonNode;
BinaryTreeNode *rsonNode;
};
//第二步 :判断是否满足
bool IsOk(BinaryTreeNode *root1, BinaryTreeNode *root2){
//空树
if(root2 == NULL){
return true;
}
if(root1 == NULL){
return false;
}
//结点值不同肯定不是子树
if(root1->value != root2->value){
return false;
}
else{
return IsOk(root1->lsonNode, root2->lsonNode)
&&IsOk(root1->rsonNode, root2->rsonNode);
}
}
//第一步:枚举树A判断B是不是子结构
bool IsSubTree(BinaryTreeNode *rootOne, BinaryTreeNode *rootTwo){
//树为空的情况
if(rootTwo == NULL){
return true;
}
if(rootOne == NULL){
return false;
}
//根节点值一样
if(rootOne->value == rootTwo->value){
//判断树A是否包含树B
if(IsOk(rootOne, rootTwo)){
return true;
}
}
return IsSubTree(rootOne->lsonNode, rootTwo)
||IsSubTree(rootOne->rsonNode, rootTwo);
}