劍指offer裡有一道題目:請完成乙個函式,輸入乙個二叉樹,該函式輸出它的映象。
二叉樹節點的定義如下:
struct binarytreenode
;
求二叉樹的映象,,即遍歷該樹的每個節點,如果遍歷到的節點有子節點,則交換其子節點,當交換完成所有非葉子子節點的左右子節點後,就得到了樹的映象。
遞迴的解法很簡單,**如下:
void mirror_recursively(binarytreenode * head)
作者在後面給了乙個擴充套件問題,讓要求實現乙個非遞迴的函式。
一般涉及到二叉樹樹的遍歷問題,非遞迴的實現大部分情況下要用到棧來實現。
思路:對於乙個節點,如果存在子節點,則入棧,同時交換其左右節點,然後讓自己出棧,左右節點入棧,依此迴圈,直到棧為空。
非遞迴的函式**如下:
void mirror_non_recurse(binarytreenode * head)
; int base = 0, top = 0;
if(head == null)
return ;
if(head->left == null && head->right == null)
return ;
//頭結點入棧
stack[top ++] = head;
while(top > base)
}
總結:碰到有涉及二叉樹的遍歷問題而不能使用遞迴實現時,考慮用棧來實現。
映象二叉樹
映象二叉樹與二叉樹的區別是左右孩子對於根節點的相對大小剛好相反不用建立映象樹,通過對原樹的映象便歷,即可得到所需的東西。後序 樹 lr根,映象 rl根。如果創立映象二叉樹,insert 改一下即可,這樣可以把preordermirror 等去掉。對於遍歷後的排序放到vector陣列裡便於比較,而且進...
映象二叉樹
題目描述 操作給定的二叉樹,將其變換為源二叉樹的映象。思路 1 獲取源二叉樹的映象,將源二叉樹的左右子樹交換即可 2 主要步驟 若二叉樹為空,直接返回 若二叉樹不為空,交換其左右子樹 遞迴的將二叉樹的其他結點進行交換 public class treenode public class soluti...
二叉樹12 二叉樹的映象
題目 操作給定的二叉樹,將其變換為源二叉樹的映象。輸入描述 思路 首先要理解業務邏輯,何為映象?所謂映象就是對於任何乙個結點,將其左右子樹進行交換即可。對於一棵以root為根結點的二叉樹,要將其映象,首先將其左右子樹 root.left為根的子樹 和 root.right為根的子樹 進行映象,然後將...