ツリーのサブ構造[データ構造]

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 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);
}