树的子结构
问题分析
输入两棵二叉树A和B,判断B是不是A的子结构
思路:
1、在树A中找到和B根节点值一样的节点R
2、再判断树A中以R节点为根节点的子树是不是包含和树B一样的结构。
代码实现
//步骤1,找一样的节点
bool HasSubTree(TreeNode* pRoot1, TreeNode * pRoot2)
{
bool res = false;
if (pRoot1 != NULL && pRoot2 != NULL)
{
if (pRoot1->val == pRoot2->val)
res = DoesTree1HaveTree2(pRoot1, pRoot2);
//以该节点为根节点的结构不是子树结构
if (!res)
res = HasSubTree(pRoot1->left, pRoot2);
if (!res)
res = HasSubTree(pRoot1->right, pRoot2);
}
return res;
}
//步骤2:在A中找到与B根节点一样的点R,判断是否有一样的结构
//递归的思路来考虑,如果两个根节点相等的话,则判断他们得左右子树是否相等,
//直到到达其中一个数的叶节点
bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode * pRoot2)
{
if (pRoot2 == NULL)//如果B结构到达叶子节点,说明匹配
return true;
if (pRoot1 == NULL)//如果A中到达叶子结点,但是B没有到达叶子节点,说明不匹配
return false;
if (pRoot1->val != pRoot2->val)
return false;
return DoesTree1HaveTree2(pRoot1->left, pRoot2->left)
&& DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
}
变形,判断两个树的结构是否相等
分析:其实这个问题与上一个问题类似,但是相对容易一些。
只是判断两个数的结构是否相等,不考虑到树的节点内容。
bool StructureCmp(Node *pRoot1,Node *pRoot2)
{
//两个根节点都为空,返回真
if(pRoot1 == NULL && pRoot2 == NULL)
return true;
if(pRoot1 == NULL || pRoot2 == NULL)
return false;
bool left = StructureCmp(pRoot1->left,pRoot2->left);
bool right = StructureCmp(pRoot2->right,pRoot2->right);
return (left&&right);
}
判断一个节点是否在二叉树中
思路:递归的方法,判断根节,然后 找左子树,找右子树
bool IsInTree(Node* pRoot,Node* find)
{
if(pRoot == NULL || find == NULL)
return false;
if(pRoot == find)
return true;
//不是根节点,找左找右
if(IsInTree(pRoot->left,find))
return true;
return IsInTree(pRoot->right,find);
}