Morris方式遍歷二叉樹的理解

2021-10-06 06:52:16 字數 1232 閱讀 2484

中序遍歷:

一:找二叉樹最左側節點。在尋找二叉樹最左側節點的過程中對於每乙個根節點(為什麼稱每乙個根節點呢?因為子樹也具有根節點)都構建其前驅節點。

中序遍歷時每個根節點的前驅節點怎麼找呢?———每個根節點的左子樹的最右側節點即為其前驅,找到前驅節點後將前驅結點的右指標指向該根節點。(構建前驅節點的過程有構建線索二叉樹的味道)

二:判斷是否訪問輸出節點。當前節點記為cur,cur節點作為根的左子樹的最右側節點記為right

如果cur沒有左子樹則輸出cur的值,並使得cur=cur->right;重複二

若cur有左子樹則判斷該左子樹的right的右指標是否指向cur

若right的右指標指向cur,則說明已經經歷過(即已經構建了前驅線索),此時訪問輸出cur,並將right的右指標置為null(拆除線索的意思),並使得cur=cur->right;重複二

若right的右指標為null,則說明未經歷過(即說明現在到了整個二叉樹的右子樹,該右子樹還未建立前驅線索),此時進入

「一」可認為是從上向下走,「二」可認為是從下往上回

void

morrismiddle

(treenode *head)

else

}else

}}

//也可以這樣寫

void

morrismiddle

(treenode *head)

else

//探索到最右側節點,這種情況為最右側節點的右指標指向p1,即已經構建好線索

p2->right=

null

;//為什麼可以在此處將線索取消呢,因為若執行到這一步的話,該線索已經被42行使用過

}//p1的左子樹為空時以及

cout<>val;

p1=p1-

>right;

//此處要麼正常進入右子樹,要麼由線索進入某子樹的根節點

}}

Morris遍歷二叉樹

morris遍歷的實質就是避免用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標指回上層的某個節點,從而完成下層到上層的移動。中序遍歷的過程如下 1.假設當前子樹的頭節點為h,讓h的左子樹中最右節點的right指標指向h,然後h的左子樹繼續步驟1的處理過程,直到遇到某乙個節...

Morris遍歷(二叉樹)

對於每乙個節點來說 對於上面這副圖來說,整個過程 進入節點5 構建 4 5右連線 進入節點3 構建 1 3右連線 進入節點1 列印1 通過 1 3 連線進入3 進入節點3 第二次進入3,列印3 進入節點4 列印4 通過 4 5 連線進入5 進入節點5 第二次進入5,列印5 注意 中序遍歷利用右子節點...

二叉樹Morris遍歷

給定乙個n個節點的二叉樹,完成前 中 後序遍歷,要求時間複雜度為o n 額外空間複雜度為o 1 二叉樹遞迴 非遞迴遍歷 1 如果當前節點的左子樹為空,則當前節點向右移動 2 如果當前節點的左子樹不為空,則找到左子樹上最右的節點 a.如果最右節點的右孩子為空,則將最右節點的右孩子指向當前節點,當前節點...