遍历二叉树结点和为指定值的所有情况

今天20180412上午面试的时候有一个二叉树的问题,要求如下:

一个树:

             10

          /        \

       5            12

/          \

3          7

上面的树,要求列出结点加起来结果为:22的所有情况,如:10 5 7 和 10  12.

因当时时间比较紧张,只想了个大概,未能正确做出。

现在想出来了,把代码贴出来记录一下,有需要的同学可以参考。如有好的建议,不吝赐教,谢谢。

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode *left;
	BinaryTreeNode *right;
	BinaryTreeNode(int x = 0)
	{
		value = x;
		left = NULL;
		right = NULL;
	}
};

list<BinaryTreeNode*> g_treeList;
BinaryTreeNode * g_root = NULL;
void PrintDetail(BinaryTreeNode * root, BinaryTreeNode *end)
{
	list<BinaryTreeNode *> trees;
	BinaryTreeNode *temp = root;
	while (temp)
	{
		if (temp->value == end->value)
		{
			trees.push_back(temp);
			for (auto itor = trees.begin(); itor != trees.end(); ++itor)
			{
				printf("%d ", (*itor)->value);
			}
			printf("\n");
			break;
		}
		else if (temp->value > end->value)
		{
			trees.push_back(temp);
			temp = temp->left;
		}
		else if (temp->value < end->value)
		{
			trees.push_back(temp);
			temp = temp->right;
		}
	}
}

BinaryTreeNode* PrintBinaryTreeCalcResult(BinaryTreeNode *root, const int val)
{
	if (root != NULL && val == root->value)
		return root;

	if (root == NULL)
		return NULL;

	//如果返回的指针不为空 表示找到了计算结果为指定值的结点 然后从root 遍历到该left或right结点即为所有结点加起来都为最初指定值的情况
	BinaryTreeNode *left = PrintBinaryTreeCalcResult(root->left, val - root->value);
	if (left != NULL)
	{
		PrintDetail(g_root, left);
	}

	BinaryTreeNode *right = PrintBinaryTreeCalcResult(root->right, val - root->value);
	if (right != NULL)
	{
		PrintDetail(g_root, right);
	}
}

void InitBinaryTreeAndPrintResult()
{
	BinaryTreeNode *root = new BinaryTreeNode(10);
	g_root = root;
	BinaryTreeNode *node = new BinaryTreeNode(5);
	root->left = node;
	node = new BinaryTreeNode(3);
	root->left->left = node;
	node = new BinaryTreeNode(7);
	node->right = new BinaryTreeNode(9);
	node->right->left = new BinaryTreeNode(8);
	node->left = new BinaryTreeNode(6);
	root->left->right = node;
	node = new BinaryTreeNode(12);
	root->right = node;
	node = new BinaryTreeNode(17);
	root->right->right = node;
	node = new BinaryTreeNode(11);
	root->right->left = node;

	PrintBinaryTreeCalcResult(root, 22);
}

void main()
{
	InitBinaryTreeAndPrintResult();
	system("pause");
	return;
}




猜你喜欢

转载自blog.csdn.net/u011803182/article/details/79921468
今日推荐