遍歷二叉樹結點和為指定值的所有情況
阿新 • • 發佈:2018-12-18
今天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; }