程式設計師面試一百題-11-求二元查詢樹的映象
阿新 • • 發佈:2018-12-16
1-題目
:
輸入一棵二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。
2-思路
:
在遍歷二元查詢樹時每訪問到一個結點,交換它的左右子樹。
3-程式碼
:
//定義二元查詢樹的結點 struct BSTreeNode { int value; BSTreeNode *pLeft; BSTreeNode *pRight; }; //遞迴實現二元查詢樹的映象 void MirrorRecursively(BSTreeNode *pNode) { if (!pNode) { return; } //交換該結點的左右子樹 BSTreeNode *pTemp = pNode->pLeft; pNode->pLeft = pNode->pRight; pNode->pRight = pTemp; //若該結點的左子樹不為空,則遞迴翻轉 if (pNode->pLeft) { MirrorRecursively(pNode->pLeft); } //若該結點的右子樹不為空,則遞迴翻轉 if (pNode->pRight) { MirrorRecursively(pNode->pRight); } } //迴圈實現二元查詢樹的映象 void MirrorIteratively(BSTreeNode *pTreeHead) { if (!pTreeHead) { return; } std::stack<BSTreeNode *> stackTreeNode; stackTreeNode.pop(); //當棧不為空 while (stackTreeNode.size()) { //取出棧頂的結點 BSTreeNode *pNode = stackTreeNode.top(); stackTreeNode.pop(); //交換該結點的左右子樹 BSTreeNode *pTemp = pNode->pLeft; pNode->pLeft = pNode->pRight; pNode->pRight = pTemp; //若該結點的左右子樹不為空,則將其壓入棧 if (pNode->pLeft) { stackTreeNode.push(pNode->pLeft); } if (pNode->pRight) { stackTreeNode.push(pNode->pRight); } } }