Morris遍歷二叉樹

2021-09-09 07:24:45 字數 1839 閱讀 2865

morris遍歷的實質就是避免用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標指回上層的某個節點,從而完成下層到上層的移動。

中序遍歷的過程如下

1.假設當前子樹的頭節點為h,讓h的左子樹中最右節點的right指標指向h,然後h的左子樹繼續步驟1的處理過程,直到遇到某乙個節點沒有左子樹時記為node,進入步驟2。

2.從node開始通過每個節點的right指標進行移動,並依次列印,假設移動到的節點為cur。對每乙個cur節點都判斷cur節點的左子樹中最右節點是否指向cur。

​ 1) .如果是,讓cur節點的左子樹中最右節點的right指標指向空,也就是把步驟1的調整後再逐漸調整回來,然後列印cur,繼續通過cur的right指標移動到下乙個節點,重複步驟2。

​ 2) .如果不是,以cur為頭的子樹重回步驟1執行。

先序遍歷的實現就是morris中序遍歷的簡單改寫。中序遍歷的列印時機放在了步驟2所描述的移動過程中,而先序遍歷只要把列印時機放在步驟1發生的時候即可。步驟1發生的時候,正在處理以h為頭的子樹,並且是以h為頭的子樹首次進入調整過程,此時直接列印h,就可以做到先根列印。

後序遍歷的實現也是morris中序遍歷的改寫,但過程更複雜,依次逆序列印所有節點的左子樹的右邊界,列印的時機放在步驟2的條件1)被觸發的時候,也就是調回去的過程發生的時候。

public

class

morris

}public

static

void

morrisin

(node head)

node cur1 = head;

node cur2 = null;

while

(cur1 != null)

if(cur2.right == null)

else

} system.out.

println

(cur1.value)

; cur1 = cur1.right;}}

public

static

void

morrispre

(node head)

node cur1 = head;

node cur2 = null;

while

(cur1 != null)

if(cur2.right == null)

else

}else

system.out.

println

(cur1.value)

; cur1 = cur1.right;}}

public

static

void

morrispos

(node head)

node cur1 = head;

node cur2 = null;

while

(cur1 != null)

if(cur2.right == null)

else

} cur1 = cur1.right;

}printedge

(head);}

private

static

void

printedge

(node head)

reverseedge

(tail);}

private

static node reverseedge

(node from)

return pre;

}}

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

Morris演算法遍歷二叉樹

中序遍歷 演算法步驟 1 如果當前節點的左子節點為空,則輸出當前節點,並將當前節點置為該節點的右子節點。2如果當前節點的左子節點不為空時,則找到當前節點左子樹的最右節點 該節點為當前節點中序遍歷的前驅節點 a 如果最右節點的右指標為空,則將最右節點的右指標指向當前節點,並把當前節點置為其左子節點。b...