今天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;
}