笔试算法之路(C/C++):输出左右“对称”序列

#PS:不明之处,请君留言,以期共同进步!


##1、题目描述
输入区间 [1, 9] 上的一个整数 n,输出满足条件的所有序列及其个数,条件如下:
(1)每个序列都有 2n 位,每位上可填数字 0 或 1;
(2)每个序列的前 n 位和后 n 位包含 1 或 0 的个数相同,即“对称”,但并不要求位置一定对应。
###示例1:
输入:1
输出:
00
11
满足条件的序列个数:2
###示例2:
输入:2
输出:
0000
0101
0110
1001
1010
1111
满足条件的序列个数:6
###示例3:
输入:3
输出:
000000
001001
001010
001100
010001
010010
010100
011011
011101
011110
100001
100010
100100
101011
101101
101110
110011
110101
110110
111111
满足条件的序列个数:20
##2、代码实现

//如果用枚举法实现,那简直是噩梦,而转换成满二叉树的路径问题,
//找出从根节点到叶节点的所有路径,再从中选出符合条件的路径打印出来,就很容易了。
#include 
#include
using namespace std;
typedef int TelemType;
typedef struct BinaryTreeNode {
	TelemType m_nValue;
	struct BinaryTreeNode *m_pLeft, *m_pRight;
}BinaryTreeNode, *BinaryTree;
long pathCount;	//符合条件的路径数

//先序创建满二叉树
void CreatBiTree(BinaryTree &root, int layer, int flag)
{
	if (0 == layer)
	{
		return;
	}
	else
	{
		//root = (BinaryTree)malloc(sizeof(BinaryTreeNode));
		root = new BinaryTreeNode();
		if (0 == flag)	//flag=0代表左子树
			root->m_nValue = 0;
		else if (1 == flag)	//flag=1代表右子树
			root->m_nValue = 1;
		else   //,flag=-1代表根节点
			root->m_nValue = -1;
		CreatBiTree(root->m_pLeft, layer - 1, 0);
		CreatBiTree(root->m_pRight, layer - 1, 1);
	}
}

//打印从根节点到叶节点的所有符合条件的路径
void findAllPath(BinaryTree pRoot, vector&path) {
	if (pRoot == NULL)
	{
		return;
	}
	path.push_back(pRoot->m_nValue);
	if (pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL) //达到叶节点
	{
		int size = path.size() - 1;
		int middle = size / 2;
		int sumFrount = 0, sumBehind = 0;
		for (int i = 1; i <= middle; ++i)
		{
			sumFrount += path[i];
			sumBehind += path[i + middle];
		}
		if (sumFrount == sumBehind)	//符合条件的打印出来
		{
			++pathCount;
			vector::const_iterator iter = path.begin(); 
			for (++iter; iter != path.end(); ++iter)
				cout << *iter;
			cout << endl;	//换行
		}
	}
	if (pRoot->m_pLeft != NULL)	//左子树
	{
		findAllPath(pRoot->m_pLeft, path);
	}
	if (pRoot->m_pRight != NULL)	//右子树
	{
		findAllPath(pRoot->m_pRight, path);
	}
	path.pop_back();//在返回到父节点之前,在路径上删除当前节点
}

int main() {
	while (true)
	{
		int number;
		BinaryTree T = NULL;
		vector path;
		cout << "请输入[1,9]之间的一个整数:";
		cin >> number;
		CreatBiTree(T, 2 * number + 1, -1);
		cout << "打印从根节点到叶节点的所有符合条件的路径:" << endl;
		findAllPath(T, path);
		path.clear();
		cout << "符合条件的路径数:" << pathCount << endl;
		pathCount = 0;
	}
	return 0;
}

你可能感兴趣的:(笔试算法之路)