青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Where there is a dream ,there is hope

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

原文地址:http://zhedahht.blog.163.com/blog/static/254111742007127104759245/
題目:輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只調整指針的指向。

  比如將二元查找樹
    
                                        10
                                          /    \
                                        6       14
                                      /  \     /  \
                                    4     8  12    16
轉換成雙向鏈表

4=6=8=10=12=14=16

  分析:本題是微軟的面試題。很多與樹相關的題目都是用遞歸的思路來解決,本題也不例外。下面我們用兩種不同的遞歸思路來分析。

  思路一:當我們到達某一結點準備調整以該結點為根結點的子樹時,先調整其左子樹將左子樹轉換成一個排好序的左子鏈表,再調整其右子樹轉換右子鏈表。最近鏈接左子鏈表的最右結點(左子樹的最大結點)、當前結點和右子鏈表的最左結點(右子樹的最小結點)。從樹的根結點開始遞歸調整所有結點。

  思路二:我們可以中序遍歷整棵樹。按照這個方式遍歷樹,比較小的結點先訪問。如果我們每訪問一個結點,假設之前訪問過的結點已經調整成一個排序雙向鏈表,我們再把調整當前結點的指針將其鏈接到鏈表的末尾。當所有結點都訪問過之后,整棵樹也就轉換成一個排序雙向鏈表了。

參考代碼:

首先我們定義二元查找樹結點的數據結構如下:
    struct BSTreeNode // a node in the binary search tree
    {
        int          m_nValue; // value of node
        BSTreeNode  *m_pLeft;  // left child of node
        BSTreeNode  *m_pRight; // right child of node
    };

思路一對應的代碼:
///////////////////////////////////////////////////////////////////////
// Covert a sub binary-search-tree into a sorted double-linked list
// Input: pNode - the head of the sub tree
//        asRight - whether pNode is the right child of its parent
// Output: if asRight is true, return the least node in the sub-tree
//         else return the greatest node in the sub-tree
///////////////////////////////////////////////////////////////////////
BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight)
{
      if(!pNode)
            return NULL;

      BSTreeNode *pLeft = NULL;
      BSTreeNode *pRight = NULL;

      // Convert the left sub-tree
      if(pNode->m_pLeft)
            pLeft = ConvertNode(pNode->m_pLeft, false);

      // Connect the greatest node in the left sub-tree to the current node
      if(pLeft)
      {
            pLeft->m_pRight = pNode;
            pNode->m_pLeft = pLeft;
      }

      // Convert the right sub-tree
      if(pNode->m_pRight)
            pRight = ConvertNode(pNode->m_pRight, true);

      // Connect the least node in the right sub-tree to the current node
      if(pRight)
      {
            pNode->m_pRight = pRight;
            pRight->m_pLeft = pNode;
      }

      BSTreeNode *pTemp = pNode;

      // If the current node is the right child of its parent, 
      // return the least node in the tree whose root is the current node
      if(asRight)
      {
            while(pTemp->m_pLeft)
                  pTemp = pTemp->m_pLeft;
      }
      // If the current node is the left child of its parent, 
      // return the greatest node in the tree whose root is the current node
      else
      {
            while(pTemp->m_pRight)
                  pTemp = pTemp->m_pRight;
      }
 
      return pTemp;
}

///////////////////////////////////////////////////////////////////////
// Covert a binary search tree into a sorted double-linked list
// Input: the head of tree
// Output: the head of sorted double-linked list
///////////////////////////////////////////////////////////////////////
BSTreeNode* Convert(BSTreeNode* pHeadOfTree)
{
      // As we want to return the head of the sorted double-linked list,
      // we set the second parameter to be true
      return ConvertNode(pHeadOfTree, true);
}

思路二對應的代碼:
///////////////////////////////////////////////////////////////////////
// Covert a sub binary-search-tree into a sorted double-linked list
// Input: pNode -           the head of the sub tree
//        pLastNodeInList - the tail of the double-linked list
///////////////////////////////////////////////////////////////////////
void ConvertNode(BSTreeNode* pNode, BSTreeNode*& pLastNodeInList)
{
      if(pNode == NULL)
            return;

      BSTreeNode *pCurrent = pNode;

      // Convert the left sub-tree
      if (pCurrent->m_pLeft != NULL)
            ConvertNode(pCurrent->m_pLeft, pLastNodeInList);

      // Put the current node into the double-linked list
      pCurrent->m_pLeft = pLastNodeInList; 
      if(pLastNodeInList != NULL)
            pLastNodeInList->m_pRight = pCurrent;

      pLastNodeInList = pCurrent;

      // Convert the right sub-tree
      if (pCurrent->m_pRight != NULL)
            ConvertNode(pCurrent->m_pRight, pLastNodeInList);
}

///////////////////////////////////////////////////////////////////////
// Covert a binary search tree into a sorted double-linked list
// Input: pHeadOfTree - the head of tree
// Output: the head of sorted double-linked list
///////////////////////////////////////////////////////////////////////
BSTreeNode* Convert_Solution1(BSTreeNode* pHeadOfTree)
{
      BSTreeNode *pLastNodeInList = NULL;
      ConvertNode(pHeadOfTree, pLastNodeInList);

      // Get the head of the double-linked list
      BSTreeNode *pHeadOfList = pLastNodeInList;
      while(pHeadOfList && pHeadOfList->m_pLeft)
            pHeadOfList = pHeadOfList->m_pLeft;

      return pHeadOfList;
}

posted on 2010-12-17 08:58 IT菜鳥 閱讀(349) 評論(0)  編輯 收藏 引用 所屬分類: 算法/數據結構

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品论坛| 最新亚洲一区| 欧美一区二区视频免费观看| 国产欧美大片| 久久一日本道色综合久久| 久久久综合视频| 在线国产亚洲欧美| 亚洲精选视频在线| 国产精品久久久免费| 久久精品官网| 欧美大片专区| 欧美亚洲在线播放| 麻豆av一区二区三区久久| 亚洲每日在线| 午夜精品免费在线| 亚洲高清一区二区三区| 亚洲伦理中文字幕| 国内自拍视频一区二区三区| 欧美激情91| 国产日韩欧美电影在线观看| 欧美韩国日本一区| 国产精品你懂的在线| 久久综合一区二区三区| 欧美日韩国产美女| 久热综合在线亚洲精品| 欧美精品一区二区高清在线观看| 午夜亚洲性色福利视频| 久久综合激情| 欧美一区久久| 欧美欧美天天天天操| 久久国产视频网| 欧美激情亚洲精品| 久久综合中文| 国产精品久久毛片a| 欧美第一黄色网| 国产日韩欧美日韩| 一区二区三区精品视频| 在线免费观看日本一区| 亚洲一区二区三区777| 亚洲国产日韩欧美在线图片| 亚洲欧美成人| 亚洲视频国产视频| 欧美jizzhd精品欧美巨大免费| 欧美在线免费视屏| 欧美日韩中文字幕在线| 欧美激情一区二区三区全黄| 国产一区成人| 亚洲欧美欧美一区二区三区| 99re6这里只有精品| 久久夜色精品亚洲噜噜国产mv| 欧美一区二区三区的| 国产精品国产成人国产三级| 亚洲高清av| 亚洲级视频在线观看免费1级| 久久精品国产第一区二区三区最新章节 | 亚洲黄网站在线观看| 极品少妇一区二区| 久久精品国产成人| 久久久久久婷| 国产一区二区在线观看免费播放| 亚洲深夜av| 香蕉成人伊视频在线观看| 国产精品久久波多野结衣| 亚洲视频免费看| 亚洲欧美美女| 国产精品日韩专区| 亚洲欧美激情四射在线日| 亚洲欧美亚洲| 国产日韩欧美在线视频观看| 亚洲一区二区影院| 久久国产免费| 国内揄拍国内精品久久 | 久久在线观看视频| 精品粉嫩aⅴ一区二区三区四区| 欧美一区二区三区在线视频| 久久精品一区蜜桃臀影院| 韩国av一区二区三区| 久久久之久亚州精品露出| 欧美成人精品在线视频| 亚洲九九爱视频| 欧美三级视频在线| 午夜精品久久久久久久久久久| 久久久xxx| 亚洲高清在线视频| 欧美日本簧片| 欧美亚洲在线| 亚洲成人在线免费| 亚洲一区不卡| 国产欧美一区二区三区国产幕精品 | 嫩草国产精品入口| 一本色道**综合亚洲精品蜜桃冫| 国产精品爱久久久久久久| 亚洲欧美日韩精品| 欧美v国产在线一区二区三区| 亚洲三级电影全部在线观看高清| 欧美日韩一区二区三区在线观看免 | 亚洲午夜成aⅴ人片| 久久黄色级2电影| 亚洲国语精品自产拍在线观看| 欧美激情精品| 性刺激综合网| 亚洲精品乱码久久久久久蜜桃91| 欧美一乱一性一交一视频| 亚洲激情视频在线播放| 国产精品久久久久7777婷婷| 久久精品欧洲| 夜夜夜精品看看| 男同欧美伦乱| 香蕉久久夜色精品国产使用方法| 国产在线视频不卡二| 欧美日本视频在线| 欧美专区在线| 中文国产一区| 亚洲经典自拍| 久久久中精品2020中文| 亚洲一区二区三区精品在线观看| 极品少妇一区二区三区| 国产酒店精品激情| 欧美日韩亚洲视频一区| 免费不卡在线视频| 性伦欧美刺激片在线观看| 亚洲精品乱码久久久久久| 欧美成人激情视频| 久久久亚洲综合| 性久久久久久久| 亚洲自拍偷拍一区| 99在线热播精品免费99热| 亚洲激精日韩激精欧美精品| 国产一区二区视频在线观看| 国产精品普通话对白| 欧美日本三区| 欧美日韩国内| 欧美日韩国产一中文字不卡| 欧美电影在线播放| 欧美成人69| 欧美v亚洲v综合ⅴ国产v| 久久久精品视频成人| 性色av香蕉一区二区| 午夜激情久久久| 亚洲欧美制服另类日韩| 亚洲欧美综合国产精品一区| 亚洲已满18点击进入久久| 亚洲午夜性刺激影院| 这里只有视频精品| 亚洲自拍电影| 亚洲综合99| 欧美一区二区视频97| 欧美一区二区视频在线| 久久国产精品免费一区| 久久久精品999| 免费在线成人| 欧美日韩美女在线| 国产精品久久久对白| 国产日韩一区| 在线精品在线| 99视频精品全国免费| 亚洲一区二区三区在线看| 午夜视频一区| 狂野欧美激情性xxxx| 亚洲高清电影| 一区二区日韩欧美| 欧美在线观看视频| 免费在线亚洲| 国产精品女主播一区二区三区| 国产精品久久久久久久电影| 国产精品久久久久久一区二区三区| 国产精品任我爽爆在线播放| 国产亚洲毛片| 亚洲精选在线| 亚洲——在线| 另类天堂av| 亚洲免费黄色| 久久精品视频在线看| 欧美激情综合在线| 国产欧美69| 亚洲美女av在线播放| 欧美一二区视频| 亚洲国产91色在线| 亚洲欧美高清| 欧美激情精品久久久久久免费印度 | 一区二区三区在线视频免费观看| 亚洲国产精品999| 亚洲欧美一区二区三区极速播放| 久久视频在线看| 在线亚洲欧美专区二区| 久久视频国产精品免费视频在线| 欧美日韩国产在线播放| 一区二区亚洲精品| 亚洲视频国产视频| 欧美韩国日本一区| 香蕉视频成人在线观看| 欧美日韩国产a| 亚洲高清自拍| 久久男人资源视频| 这里只有精品丝袜| 欧美高清在线一区| 欲香欲色天天天综合和网| 午夜精品网站| 亚洲精品在线电影| 久色婷婷小香蕉久久|