您的位置:首页 > 其它

【二叉树】树的子结构/判断一个节点是否在二叉树中

2017-07-27 15:40 453 查看

树的子结构

问题分析

输入两棵二叉树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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐