首頁(yè) - 網(wǎng)校 - 萬(wàn)題庫(kù) - 美好明天 - 直播 - 導(dǎo)航
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 模擬試題 > 程序員 > 正文

計(jì)算機(jī)軟件水平考試《程序員》面試題精選題(2)

來(lái)源:考試吧 2017-10-18 11:56:35 要考試,上考試吧! 萬(wàn)題庫(kù)
“計(jì)算機(jī)軟件水平考試《程序員》面試題精選題(2)”供考生參考。更多軟件水平考試內(nèi)容請(qǐng)?jiān)L問考試吧軟件水平考試網(wǎng)。

  -求二元查找樹的鏡像

  題目:輸入一顆二元查找樹,將該樹轉(zhuǎn)換為它的鏡像,即在轉(zhuǎn)換后的二元查找樹中,左子樹的結(jié)點(diǎn)都大于右子樹的結(jié)點(diǎn)。用遞歸和循環(huán)兩種方法完成樹的鏡像轉(zhuǎn)換。

  例如輸入:

  8

  / \

  6 10

  /\ /\

  5 7 9 11

  輸出:

  8

  / \

  10 6

  /\ /\

  11 9 7 5

  定義二元查找樹的結(jié)點(diǎn)為:

  struct BSTreeNode // a node in the binary search tree (BST)

  {

  int m_nValue; // value of node

  BSTreeNode *m_pLeft; // left child of node

  BSTreeNode *m_pRight; // right child of node

  };

  分析:盡管我們可能一下子不能理解鏡像是什么意思,但上面的例子給我們的直觀感覺,就是交換結(jié)點(diǎn)的左右子樹。我們?cè)囍诒闅v例子中的二元查找樹的同時(shí)來(lái)交換每個(gè)結(jié)點(diǎn)的左右子樹。遍歷時(shí)首先訪問頭結(jié)點(diǎn)8,我們交換它的左右子樹得到:

  8

  / \

  10 6

  /\ /\

  9 11 5 7

  我們發(fā)現(xiàn)兩個(gè)結(jié)點(diǎn)6和10的左右子樹仍然是左結(jié)點(diǎn)的值小于右結(jié)點(diǎn)的值,我們?cè)僭囍粨Q他們的左右子樹,得到:

  8

  / \

  10 6

  /\ /\

  11 9 7 5

  剛好就是要求的輸出。

  上面的分析印證了我們的直覺:在遍歷二元查找樹時(shí)每訪問到一個(gè)結(jié)點(diǎn),交換它的左右子樹。這種思路用遞歸不難實(shí)現(xiàn),將遍歷二元查找樹的代碼稍作修改就可以了。參考代碼如下:

  ///////////////////////////////////////////////////////////////////////

  // Mirror a BST (swap the left right child of each node) recursively

  // the head of BST in initial call

  ///////////////////////////////////////////////////////////////////////

  void MirrorRecursively(BSTreeNode *pNode)

  {

  if(!pNode)

  return;

  // swap the right and left child sub-tree

  BSTreeNode *pTemp = pNode->m_pLeft;

  pNode->m_pLeft = pNode->m_pRight;

  pNode->m_pRight = pTemp;

  // mirror left child sub-tree if not null

  if(pNode->m_pLeft)

  MirrorRecursively(pNode->m_pLeft);

  // mirror right child sub-tree if not null

  if(pNode->m_pRight)

  MirrorRecursively(pNode->m_pRight);

  }

  由于遞歸的本質(zhì)是編譯器生成了一個(gè)函數(shù)調(diào)用的棧,因此用循環(huán)來(lái)完成同樣任務(wù)時(shí)最簡(jiǎn)單的辦法就是用一個(gè)輔助棧來(lái)模擬遞歸。首先我們把樹的頭結(jié)點(diǎn)放入棧中。在循環(huán)中,只要棧不為空,彈出棧的棧頂結(jié)點(diǎn),交換它的左右子樹。如果它有左子樹,把它的左子樹壓入棧中;如果它有右子樹,把它的右子樹壓入棧中。這樣在下次循環(huán)中就能交換它兒子結(jié)點(diǎn)的左右子樹了。參考代碼如下:

  ///////////////////////////////////////////////////////////////////////

  // Mirror a BST (swap the left right child of each node) Iteratively

  // Input: pTreeHead: the head of BST

  ///////////////////////////////////////////////////////////////////////

  void MirrorIteratively(BSTreeNode *pTreeHead)

  {

  if(!pTreeHead)

  return;

  std::stackstackTreeNode;

  stackTreeNode.push(pTreeHead);

  while(stackTreeNode.size())

  {

  BSTreeNode *pNode = stackTreeNode.top();

  stackTreeNode.pop();

  // swap the right and left child sub-tree

  BSTreeNode *pTemp = pNode->m_pLeft;

  pNode->m_pLeft = pNode->m_pRight;

  pNode->m_pRight = pTemp;

  // push left child sub-tree into stack if not null

  if(pNode->m_pLeft)

  相關(guān)推薦:

  2017年計(jì)算機(jī)軟件水平考試時(shí)間公布(全年)

  各地2017年軟件水平考試準(zhǔn)考證打印/領(lǐng)取時(shí)間匯總

  考試吧特別策劃:2017年計(jì)算機(jī)軟考報(bào)考指南專題熱點(diǎn)文章

  軟考各科目模擬試題及答案各科目復(fù)習(xí)指導(dǎo)匯總

  軟考報(bào)考條件軟考報(bào)名方法考試大綱科目

  歷年軟考真題及答案匯總軟件水平考試簡(jiǎn)介

0
收藏該文章
0
收藏該文章
文章搜索
·精選試題 ·智能練習(xí)
·智能評(píng)估 ·視頻解析
掃描二維碼下載
  • 初級(jí)職稱
  • 中級(jí)職稱
  • 高級(jí)職稱

版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請(qǐng)與我們聯(lián)系800@exam8.com,我們將會(huì)及時(shí)處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請(qǐng)注明出處。
Copyright © 2004-2025 考試吧軟件水平考試網(wǎng) 出版物經(jīng)營(yíng)許可證新出發(fā)京批字第直170033號(hào)  
京ICP證060677 京ICP備05005269號(hào) 中國(guó)科學(xué)院研究生院權(quán)威支持(北京)
在線模擬試題
考證通關(guān)殺器
考試最新資訊
學(xué)
一次通關(guān)技巧