求二元查詢樹的映象

2021-06-08 16:40:08 字數 1279 閱讀 8061

題目:輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。

例如輸入: 8

/\610

/\/\57

911輸出: 8/

\106/\ 

/\11

9  7

5定義二元查詢樹的結點為:

struct bstreenode // a node in the binary search tree (bst)

;

分析:儘管我們可能一下子不能理解映象是什麼意思,但上面的例子給我們的直觀感覺,就是交換結點的左右子樹。我們試著在遍歷例子中的二元查詢樹的同時來交換每個結點的左右子樹。遍歷時首先訪問頭結點8,我們交換它的左右子樹得到: 8

/\106

/\/\911

57我們發現兩個結點6和10的左右子樹仍然是左結點的值小於右結點的值,我們再試著交換他們的左右子樹,得到: 8

/\106

/\ /\

119 75

剛好就是要求的輸出。

上面的分析印證了我們的直覺:在遍歷二元查詢樹時每訪問到乙個結點,交換它的左右子樹。這種思路用遞迴不難實現,將遍歷二元查詢樹的**稍作修改就可以了。參考**如下:

///

// mirror a bst (swap the left right child of each node) recursively

// the head of bst in initial call

///void mirrorrecursively(bstreenode *pnode)

由於遞迴的本質是編譯器生成了乙個函式呼叫的棧,因此用迴圈來完成同樣任務時最簡單的辦法就是用乙個輔助棧來模擬遞迴。首先我們把樹的頭結點放入棧中。在迴圈中,只要棧不為空,彈出棧的棧頂結點,交換它的左右子樹。如果它有左子樹,把它的左子樹壓入棧中;如果它有右子樹,把它的右子樹壓入棧中。這樣在下次迴圈中就能交換它兒子結點的左右子樹了。參考**如下:

///

// mirror a bst (swap the left right child of each node) iteratively

// input: ptreehead: the head of bst

///void mirroriteratively(bstreenode *ptreehead)

}

**何海濤部落格

求二元查詢樹的映象

程式設計師面試題精選 11 求二元查詢樹的映象 題目 輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。例如輸入 8 610 5 7911輸出 8 106 1197 5定義二元查詢樹的結點為 struct bst...

求二元查詢樹的映象

輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。例如輸入 8 6 10 5 7 9 11 輸出 8 10 6 119 7 52週前 22次瀏覽 0 您投過票了 定義二元查詢樹的結點為 struct bstree...

求二元查詢樹的映象

題目 輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。例如輸入 8 6 10 5 7 9 11 輸出 8 10 6 11 9 7 5 定義二元查詢樹的結點為 struct bstreenode a node i...