微軟等資料結構與演算法面試100題 第十五題

2021-06-08 22:11:29 字數 1774 閱讀 1304

第十五題

題目:輸入一顆二元查詢樹,將該樹轉換為它的映象,

即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。

用遞迴和迴圈兩種方法完成樹的映象轉換。

分析:題目要求求解乙個二元搜尋樹的映象,用兩種方法實現,遞迴和非遞迴。

首先,對於求解乙個二元搜尋樹映象其實就是把樹中的每個節點的左右子樹調換了即可,因此思路就是周遊乙個樹的所有節點,對於每個節點其左右子樹對調。

周遊乙個樹主要有兩種方法,深度優先的周遊和廣度優先的周遊。分別使用了棧stack和佇列queue。其中深度優先周遊可以使用遞迴的方法和非遞迴的方法。廣度優先使用了

非遞迴的方法。這裡這幾種方法都可以實現題目的要求。

在這裡,我們選用了比較棧來實現遞迴和非遞迴的兩種方法。

遞迴方法**:

#includeusing namespace std;

struct node

;class bstree

; void addnodebst(const int item, node * &root);

void inorder(node * root);

node * root();

void mirrorbstree(node * &root);

};void bstree::addnodebst(const int item, node * &root)

else

else if(item > root ->value)

else

}void bstree::mirrorbstree(node * & root)

node * ptemp;

//遞迴遍歷

if(null!=root) }

int main()

非遞迴方法**:

#include#includeusing namespace std;

struct node

;class bstree

; void addnodebst(const int item, node * &root);

void inorder(node * root);

node * root();

void mirrorbstree(node * &root);

};void bstree::addnodebst(const int item, node * &root)

else

else if(item > root ->value)

else

}void bstree::mirrorbstree(node * & root)

node * ptemp;

//遞迴遍歷

//if(null!=root)

// //非遞迴二叉樹周遊,可以使用深度優先也可以使用廣度優先,這裡採用了深度優先

stacknodestack;

node * pstacktemp = root;

node * pextemp;

nodestack.push(null); //壓入監視哨

while(pstacktemp)

if(null!=pstacktemp->rightnode)

if(!nodestack.empty())

}}int main()

微軟等資料結構與演算法面試100題 第五題

第五題 查詢最小的k個元素 題目 輸入n個整數,輸出其中最小的k個。例如輸入1,2,3,4,5,6,7和8這8個數字,則最小的4個數字為1,2,3和4。分析 本題目要求計算n個整數的最小的k個,題目沒有直接給出複雜度的要求,因此有很多種解法。比如排序後一次輸出等 很多種解法。如果是要求複雜度為klo...

微軟等資料結構與演算法面試100題 第七題

第七題 微軟亞院之程式設計判斷倆個鍊錶是否相交 給出倆個單向鍊錶的頭指標,比如h1,h2,判斷這倆個鍊錶是否相交。為了簡化問題,我們假設倆個鍊錶均不帶環。問題擴充套件 1.如果鍊錶可能有環列?2.如果需要求出倆個鍊錶相交的第乙個節點列?分析 實現 includeusing namespace std...

微軟等資料結構與演算法面試100題 第十題

第十題 翻轉句子中單詞的順序。題目 輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。例如輸入 i am a student.則輸出 student.a am i 分析 可以根據空格符將單詞分開,然後針對每個單詞進行操作,...