精妙的Morris二叉樹遍歷演算法

2021-06-20 19:28:49 字數 753 閱讀 5458

今天介紹一種精妙的無堆疊,o(1)空間的二叉樹遍歷演算法:

morris遍歷

,它是morris發明的。

大家都很熟悉用遞迴和堆疊來實現二叉樹的遍歷,比如,前序遍歷,中序遍歷,後序遍歷。但morris 遍歷,使用無堆疊,o(1) 空間進行二叉樹遍歷。它的原理很簡單,利用所有葉子結點的右指標,指向其後繼結點,組成乙個環,在第二次遍歷到這個結點時,由於其左子樹已經遍歷完了,則訪問該結點。

演算法偽碼:

morrisinorder():

while 沒有結束

如果當前節點沒有左後代

訪問該節點

轉向右節點

否則找到左後代的最右節點,且使最右節點的右指標指向當前節點

轉向左後代節點

c++實現:

void bst_morris_inorder(struct bst_node *root)    

else

else

} }

}

template實現:

演算法示例:

思考題:

怎麼實現morris前序遍歷?後序遍歷?

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.如果最右節點的右孩子為空,則將最右節點的右孩子指向當前節點,當前節點...