题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。二叉树结点的定义如下:
//二叉树的定义
struct BinTreeNode{
int m_value;
BinTreeNode *left;
BinTreeNode *right;
//创建根节点,值为e
BinTreeNode* createRoot(int e);
//将e作为当前结点的左孩子值插入
void insertAsLC(int e);
//将e作为当前结点的右孩子值插入
void insertAsRC(int e);
};
//创建根节点,值为e
BinTreeNode* BinTreeNode::createRoot(int e){
BinTreeNode *root = new BinTreeNode;
root->m_value = e;
return root;
}
//作为节点的左孩子插入元素e
void BinTreeNode::insertAsLC(int e){
BinTreeNode *Left = new BinTreeNode;
Left->m_value = e;
this->left = Left;
}
//作为节点的右孩子插入元素e
void BinTreeNode::insertAsRC(int e){
BinTreeNode *Right = new BinTreeNode;
Right->m_value = e;
this->right = Right;
}
解题思路:
- 两棵树是否为空的情况;
- 如果有A、B两棵树,验证B树是不是A树中的一颗子树;
- 需要先对比根节点
- 若根节点相同,则对比左右子节点
- 若左右子节点不同,则需要继续在A树中查找与B树根节点相等的节点。
测试用例:
int main(){
//创建一颗A树
BinTreeNode *A = new BinTreeNode;
A->m_value = 8;
A->insertAsLC(8);
A->insertAsRC(7);
A->left->insertAsLC(9);
A->left->insertAsRC(2);
A->left->right->insertAsLC(4);
A->left->right->insertAsRC(7);
//创建一棵B树
BinTreeNode *B = new BinTreeNode;
B->m_value = 8;
B->insertAsLC(9);
B->insertAsRC(2);
//判断B是不是A的子树
bool result = HasSubTree(A, B); //Output: Sub Tree
//判定结果
if(result)
std::cout << "Sub Tree\n";
else
std::cout << "Isn't sub tree\n";
return 0;
}
函数实现:
//DoesTree1HaveTree2函数
bool DoesTree1HaveTree2(BinTreeNode *A_Root, BinTreeNode *B_Root){
//进入此函数说明根节点相等
if(!B_Root)//如果B树为空,则为真
return true;
if(!A_Root)
return false;
if(A_Root->m_value != B_Root->m_value)
return false;
return DoesTree1HaveTree2(A_Root->left, B_Root->left) && DoesTree1HaveTree2(A_Root->right, B_Root->right);
}
//主函数实现
bool HasSubTree(BinTreeNode *A_Root, BinTreeNode *B_Root){
bool result = false;
if(A_Root != NULL && B_Root != NULL){
//先对比根节点
if(A_Root->m_value == B_Root->m_value){//若想等,对比子树节点
result = DoesTree1HaveTree2(A_Root, B_Root);
}
//再分别判断左右子树
if(!result)
result = HasSubTree(A_Root->left, B_Root);
if(!result)
result = HasSubTree(A_Root->right, B_Root);
}
return result;
}