題目:輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。 例如輸入:
8 / \
6 10
/\ /\
5 7 9 11
輸出:
8 / \
10 6
/\ /\
11 9 7 5
定義二元查詢樹的結點為:
c++**
structbstreenode // a node in the binary search tree (bst)
;
struct bstreenode // a node in the binary search tree (bst)分析:儘管我們可能一下子不能理解映象是什麼意思,但上面的例子給我們的直觀感覺,就是交換結點的左右子樹。我們試著在遍歷例子中的二元查詢樹的同時來交換每個結點的左右子樹。遍歷時首先訪問頭結點8,我們交換它的左右子樹得到:;
8 / \
10 6
/\ /\
9 11 5 7
我們發現兩個結點6和10的左右子樹仍然是左結點的值小於右結點的值,我們再試著交換他們的左右子樹,得到:
8 / \
10 6
/\ /\
11 9 7 5
剛好就是要求的輸出。
上面的分析印證了我們的直覺:在遍歷二元查詢樹時每訪問到乙個結點,交換它的左右子樹。這種思路用遞迴不難實現,將遍歷二元查詢樹的**稍作修改就可以了。參考**如下:
c++**
///
// mirror a bst (swap the left right child of each node) recursively
// the head of bst in initial call
///
voidmirrorrecursively(bstreenode *pnode)
///由於遞迴的本質是編譯器生成了乙個函式呼叫的棧,因此用迴圈來完成同樣任務時最簡單的辦法就是用乙個輔助棧來模擬遞迴。首先我們把樹的頭結點放入棧中。在迴圈中,只要棧不為空,彈出棧的棧頂結點,交換它的左右子樹。如果它有左子樹,把它的左子樹壓入棧中;如果它有右子樹,把它的右子樹壓入棧中。這樣在下次迴圈中就能交換它兒子結點的左右子樹了。參考**如下:// mirror a bst (swap the left right child of each node) recursively
// the head of bst in initial call
///void mirrorrecursively(bstreenode *pnode)
c++**
///
// mirror a bst (swap the left right child of each node) iteratively
// input: ptreehead: the head of bst
///
voidmirroriteratively(bstreenode *ptreehead)
}
程式設計師面試題精選(27) 二元樹的深度
題目 輸入一棵二元樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。例如 輸入二元樹 10 614 412 16 輸出該樹的深度3。二元樹的結點定義如下 struct sbinarytreenode a node of the bin...
程式設計師面試題精選
問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...
程式設計師面試題精選100題
今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...