中序遍歷
演算法步驟:
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的處理過程,直到遇到某乙個節...