Morris演算法遍歷二叉樹

2021-07-27 02:59:37 字數 1425 閱讀 5119

中序遍歷

演算法步驟:

1 如果當前節點的左子節點為空,則輸出當前節點,並將當前節點置為該節點的右子節點。

2如果當前節點的左子節點不為空時,則找到當前節點左子樹的最右節點(該節點為當前節點中序遍歷的前驅節點)

a 如果最右節點的右指標為空,則將最右節點的右指標指向當前節點,並把當前節點置為其左子節點。

b 如果最右節點的右指標不為空,則輸出當前節點,並將最右節點的右指標重新置為空,將當前節點置為其右子節點。

3 重複1和2,直至當前節點為空。

(建議自己畫圖並結合程式)

「` //中序遍歷

public list morrisinorder(treenode root) else

if(tmp.right==null) else }}

return result;

}「`前序遍歷

演算法步驟:

1如果當前節點的左子節點為空,則輸出當前節點,並將當前節點置為該節點的右子節點。

2 如果當前節點的左子節點不為空,則找到當前節點左子樹的最右節點(該節點為當前節點中序遍歷的前驅節點)

a 如果最右節點的右指標為空,則輸出當前節點,並將最右節點的右指標指向當前節點,當前節點置為其左子節點

b 如果最右節點的右指標不為空,則將最右節點的右指標重新置為空,並將當前節點置為其右子節點。

3 重複1和2,直至當前節點為空

「` //前序遍歷

public list morrispreorder(treenode root) else

if(tmp.right==null) else

} }

return result;

}「`後序遍歷:需要建立乙個臨時節點,並令該節點的左子節點為root,並且需要乙個子過程,倒序輸出某兩個節點之間路徑上的各個節點。

演算法步驟:

1 如果當前節點的左子節點為空,則將其右子節點作為當前節點。

2 如果當前節點的左子節點不為空,則找到當前節點左子樹的最右節點(該節點為中序遍歷的前驅節點)

a 如果最右節點的右指標為空,則將最右節點的右指標指向當前節點,當前節點置為其左子節點。

b 如果最右節點的右指標不為空,則將最右節點的右指標重新置為空,倒序輸出從當前節點的左子節點到該最右節點路徑上的所有節點,並將當前節點置為其右節點。

3 重複1和2,直至當前節點為空。

//後序遍歷

public

list

<

integer

> morrispostorder(treenode root) else else

result.addall(tmplist);

cur=cur.right;}}

}return result;

}

Morris演算法 二叉樹遍歷

一 演算法介紹 morris演算法充分利用了二叉樹葉子節點下的空間,從而可以在時間複雜度為o n 空間複雜度為o 1 的條件下,前中後序遍歷二叉樹 不是完全二叉樹也可以使用 而常見的遍歷二叉樹的方法為遞迴和棧迭代,這兩種方法的時間複雜度雖然也為o n 但是空間複雜度需要o n 因此morris演算法...

二叉樹遍歷演算法 Morris演算法

morris演算法的時間複雜度是o n 空間複雜度為o 1 基本思想是 1.找到當前節點的前驅節點,即左節點的最右節點,若為空則指向當前節點,若為當前節點則表明該節點左邊以及該節點已經遍歷完,並將前驅節點的有指標恢復為空 2.若當前節點的左節點為空,則直接訪問當前節點右節點 前序遍歷和中序遍歷 差不...

Morris遍歷二叉樹

morris遍歷的實質就是避免用棧結構,而是讓下層到上層有指標,具體是通過讓底層節點指向null的空閒指標指回上層的某個節點,從而完成下層到上層的移動。中序遍歷的過程如下 1.假設當前子樹的頭節點為h,讓h的左子樹中最右節點的right指標指向h,然後h的左子樹繼續步驟1的處理過程,直到遇到某乙個節...