Morris神級遍歷二叉樹

2021-10-10 17:13:21 字數 1894 閱讀 6579

morris遍歷是二叉樹遍歷演算法的超強高階演算法,跟遞迴、非遞迴(棧實現)的空間複雜度,morris遍歷可以將非遞迴遍歷中的空間複雜度降為o(1)。

從而實現時間複雜度為o(n),而空間複雜度為o(1)的精妙演算法。

morris遍歷利用的是樹的葉節點左右孩子為空(樹的大量空閒指標),實現空間開銷的極限縮減。

避免使用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標去指回上層的原節點,從而完成下層到上層的移動

建立一種機制,對於沒有左子樹的節點只到達一次,對於有左子樹的節點會到達兩次

記作當前節點為cur

public

class

morris

}public

void

morris

(node head)

node cur = head;

node mostright = null;

while

(cur != null)

//從上面的while出來後,mostright就是cur左子樹上最右的節點

//第一次來到必然左子樹最右節點的右子樹必空

if(mostright.right == null)

else

if(mostright.right == cur)

}//除了左子樹最右節點的右子樹為空的情況不讓cur右移

//1.沒有左子樹

//2.左子樹最右節點的右子樹指向cur

cur = cur.right;}}

}

根據morris遍歷,中左右

1.對於cur只能到達一次的節點(無左子樹的節點),cur到達時直接列印

2.對於cur到達兩次的節點(有左子樹的節點),第一次到達時cur到達時直接列印,第二次到達時不列印

//前序遍歷,中左右

public

void

morrispre

(node head)

node cur = head;

node mostright = null;

while

(cur != null)

if(mostright.right == null)

else

}else

cur = cur.right;

}}

根據morris遍歷,左中右

1.對於cur只能到達一次的節點(無左子樹的節點),cur到達時直接列印

2.對於cur到達兩次的節點(有左子樹的節點),第一次到達時不列印,第二次到達時cur到達時直接列印

//中序遍歷,左中右

public

void

morrisin

(node head)

node cur = head;

node mostright = null;

while

(cur != null)

if(mostright.right == null)

else

}//1.無左子樹,直接列印

//2.有左子樹,但是第二次到達,第二次的時候列印

system.out.

println

(cur.value +

" ")

; cur = cur.right;

}}

至於改寫後序遍歷,博主有點菜,請理解

好兄弟們給個贊,聽說給贊的考試和四六級面試都必過

聯絡博主qq851477108

備註csdn

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