ツリーのサブ構造[データ構造]
1468 ワード
タイトル:二叉樹の結点の定義は以下の通りです.
struct TreeNode
{
要点 munValue;
TreeNode*mup Left;
TreeNode*mup Right;
}
二本の二叉樹AとBを入力して、木BがAのサブ構造であるかどうかを判断します.
例えば、下の図の2本の木AとBは、Aの一部の子樹の構造がBと同じであるため、BはAのサブ構造である.
1 8 / \ / \ 8 7 9 2 / \ 9 2 / \ 4 7
struct TreeNode
{
要点 munValue;
TreeNode*mup Left;
TreeNode*mup Right;
}
二本の二叉樹AとBを入力して、木BがAのサブ構造であるかどうかを判断します.
例えば、下の図の2本の木AとBは、Aの一部の子樹の構造がBと同じであるため、BはAのサブ構造である.
1 8 / \ / \ 8 7 9 2 / \ 9 2 / \ 4 7
struct Node
{
int val;
Node *left;
Node *right;
Node(int v)
{
val = v;
left = right = NULL;
}
};
bool visitSub(Node *a, Node *b)
{
if (b == NULL)
{
return true;
}
if (a == NULL)
{
return false;
}
if (a->val != b->val)
{
return false;
}
return visitSub(a->left, b->left) && visitSub(a->right, b->right);
}
bool visit(Node *a, Node *b)
{
bool result = false;
if (a->val == b->val)
{
result = visitSub(a, b);
}
if (!result && a->left != NULL)
{
result = visit(a->left, b);
}
if (!result && a->right != NULL)
{
result = visit(a->right, b);
}
return result;
}
bool hasSubtree(Node *a, Node *b)
{
if (a == NULL && b == NULL)
{
return true;
}
if (a == NULL && b != NULL)
{
return false;
}
if (a != NULL && b == NULL)
{
return false;
}
return visit(a, b);
}