日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只調整指針的指向。

  比如將二元查找樹
??? ??????????????????????????????????????? 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 nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNode *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-treeif(pNode->m_pLeft)pLeft = ConvertNode(pNode->m_pLeft, false);// Connect the greatest node in the left sub-tree to the current nodeif(pLeft){pLeft->m_pRight = pNode;pNode->m_pLeft = pLeft;}// Convert the right sub-treeif(pNode->m_pRight)pRight = ConvertNode(pNode->m_pRight, true);// Connect the least node in the right sub-tree to the current nodeif(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 nodeif(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 nodeelse{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 truereturn 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-treeif (pCurrent->m_pLeft != NULL)ConvertNode(pCurrent->m_pLeft, pLastNodeInList);// Put the current node into the double-linked listpCurrent->m_pLeft = pLastNodeInList; if(pLastNodeInList != NULL)pLastNodeInList->m_pRight = pCurrent;pLastNodeInList = pCurrent;// Convert the right sub-treeif (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 listBSTreeNode *pHeadOfList = pLastNodeInList;while(pHeadOfList && pHeadOfList->m_pLeft)pHeadOfList = pHeadOfList->m_pLeft;return pHeadOfList; }


本文已經收錄到《劍指Offer——名企面試官精講典型編程題》一書中,有改動,歡迎關注。

博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://zhedahht.blog.163.com/。整理出版物請和作者聯系。對解題思路有任何建議,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht或者http://t.163.com/zhedahht與我討論。謝謝。我還寫了這篇博客的英文版,感興趣的讀者請到http://codercareer.blogspot.com/2011/09/interview-question-no-1-binary-search.html查看。謝謝。

總結

以上是生活随笔為你收集整理的程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。