二叉樹的Morris遍歷

2021-09-12 12:18:56 字數 1552 閱讀 5237

之前總結過二叉樹的經典遍歷演算法,包括遞迴和常規非遞迴演算法,其時間複雜度和空間複雜度均為o(n)。morris演算法巧妙地利用了二叉樹的線索化思路,把葉節點的空指標利用起來,將二叉樹的遍歷演算法的空間複雜度降低為o(1),時間複雜度仍然為o(n)。

主要思路:找到每個節點的左子樹的最右節點,讓它指向本節點。在遍歷之後恢復節點的空指標。

public

static

void

morrispre

(node head)

node cur1 = head;

node cur2 = null;

while

(cur1 != null)

if(cur2.right == null)

else

}else

cur1 = cur1.right;

} system.out.

println()

;}

public

static

void

morrisin

(node head)

node cur1 = head;

node cur2 = null;

while

(cur1 != null)

if(cur2.right == null)

else

} system.out.

print

(cur1.value +

" ")

;//注意不同順序的不同列印時機

cur1 = cur1.right;

} system.out.

println()

;}

後序遍歷較為複雜,需要將每個子樹的右邊界逆序列印,再更改回來。

public

static

void

printedge

(node head)

reverseedge

(tail);}

public

static node reverseedge

(node from)

return pre;

}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)

; system.out.

println()

;}

public

static

void

main

(string[

] args)

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