題目:輸入一顆二元查找樹,將該樹轉換爲它的鏡像,即在轉換後的二元查找樹中,左子樹的結點都大於右子樹的結點。用遞歸和循環兩種方法完成樹的鏡像轉換。
例如輸入:
8
/ /
6 10
// //
5 7 9 11
輸出:
8
/ /
10 6
// //
11 9 7 5
定義二元查找樹的結點爲:
解法一:採用遞歸思路,層層交換節點的左右孩子指針。(不能交換值)
解法二:用棧代替遞歸。因爲遞歸的本質是編譯器產生了一個函數調用的棧。做法是首先將root節點push入棧。然後進入循環,當棧不爲空時,pop棧頂。交換棧頂的左右子樹。將左右子樹分別push進棧。繼續循環。
本題無論採用什麼方式遍歷樹,只要保證每個節點只訪問一次,在訪問節點的時候交換左右子樹,都能得到正確的結果。