题目
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路
- 在树A中找到和树B的根节点值一样的节点R。
- 判断以R为根节点的子树是不是包含和树B一样的结构。
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
// 树1位空,树2不可能是1的子树。树2位空,空树不是任意树的子结构。
if ( pRoot1 == nullptr || pRoot2 == nullptr )
return false;
return doseTree1HaveTree2( pRoot1, pRoot2 ) // 两个树都非空时进行判断。
|| HasSubtree( pRoot1->left, pRoot2 ) // 如果 || 前不成立,判断树2在不在树1的左子树中。
|| HasSubtree( pRoot1->right, pRoot2 ); // 如果 || 前不成立,判断树2在不在树1的右子树中。
}
bool doseTree1HaveTree2( TreeNode* node1, TreeNode* node2 ) {
if ( node2 == nullptr ) return true; // node2为空,说明遍历完了树2,返回true。
if ( node1 == nullptr ) return false; // node2不为空,node1为空,说明遍历完了树1,树2还没遍历完,返回false.
if ( node1->val != node2->val ) return false; // 如果当前结点值不相同,返回false
return doseTree1HaveTree2(node1->left, node2->left ) // 如果当前结点值相同,判断树2的左右结点是否满足。
&& doseTree1HaveTree2(node1->right, node2->right );
}
};