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