輸入一顆二元查詢樹,將該樹轉換為它的映象,即在轉換後的二元查詢樹中,左子樹的結點都大於右子樹的結點。用遞迴和迴圈兩種方法完成樹的映象轉換。
例如輸入:
8/ /
6 10
// //
5 7 9 11
輸出:8
/ /
10 6
// //
11 9 7 5
定義二元查詢樹的結點為:
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
剛好就是要求的輸出。
///// mirror a bst (swap the left right child of each node) recursively
// the head of bst in initial call
///void mirrorrecursively(bstreenode *pnode)
由於遞迴的本質是編譯器生成了乙個函式呼叫的棧,因此用迴圈來完成同樣任務時最簡單的辦法就是用乙個輔助棧來模擬遞迴。首先我們把樹的頭結點放入棧中。在迴圈中,只要棧不為空,彈出棧的棧頂結點,交換它的左右子樹。如果它有左子樹,把它的左子樹壓入棧中;如果它有右子樹,把它的右子樹壓入棧中。這樣在下次迴圈中就能交換它兒子結點的左右子樹了。參考**如下:
C 筆試題之二叉樹的映象
關於二叉樹定義可參考 題目 請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。二叉樹結點的定義如下 struct binarytreenode 通過畫圖,可知二叉樹的映象如下圖所示 根據畫圖可得到這樣的思路 先序遍歷樹的每個結點,若遍歷到的結點有子結點,則交換它的兩個子結點。有兩種實現方法 1.遞...
leetcode之二叉樹的映象
invert binary tree invert a binary tree.4 2 7 1 3 6 9to4 7 2 9 6 3 1幾周前,我用的是遞迴解法,如下 definition for a binary tree node.struct treenode struct treenode ...
二叉樹之 二叉樹深度
二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...