這種練習可能會有很多限制,我可能會錯過。我希望這至少有一點有用。
我假設FSM在'當前節點'上的任何給定時間'站立'是可以接受的,因此它有可用的輸入返回正確的0/1值與關於這個當前節點的信息。
輸入:
- AmIALeftChild(等於1如果當前節點是懸留下了他們的父節點,否則爲0)
- AmIARightChild(1,如果我掛離開我的父節點,否則爲0)
- HaveLeftChild? (如果我有左孩子,則爲1,否則爲0)
- HaveRightChild? (如果我有一個正確的孩子,則爲1,否則爲0)
可以按照這3個輸出中的說明「遍歷它」嗎?
輸出:
- GoToLeftChild
- GoToRightChild
- GOUP
(只有3個輸出的1可以在任何給定的時間爲真)
如果兩個約束是允許,那麼你可以建立一個像這樣的FSM:
名
美國
- 啓動
- NormalTraverse
- GoBackFromLeft
- GoBackFromRight
- 成品
這是國家機器:
Start -> just go to NormalTraverse state (assuming we are on the root, right)
NormalTraverse ->
If HaveLeftChild=1 Then
Set GoToLeftChild=1 (and others outputs to 0)
Go to NormalTraverse
ElseIf HaveRightChild Then
Set GoToRightChild=1
Go to NormalTraverse
ElseIf AmIALeftChild Then
Set GoUp=1
Go to GoBackFromLeft
ElseIf AmIARightChild Then
Set GoUp=1
Go to GoBackFromRight
Else
Go to Finished.
GoBackFromLeft ->
If HaveRightChild Then
Set GoToRightChild=1
Go to NormalTraverse.
ElseIf AmIALeftChild Then
Set GoUp=1
Go to GoBackFromLeft
ElseIf AmIARightChild Then
Set GoUp=1
Go to GoBackFromRight
Else
Go to Finished.
GoBackFromRight
If AmIALeftChild Then
Set GoUp=1
Go to GoBackFromLeft
ElseIf AmIARightChild Then
Set GoUp=1
Go to GoBackFromRight
Else
Go to Finished.
現在請原諒我的英語,請注意代碼不是程序性的,「正確地」'正確''擴展'它們之後,「IF」應該是相互排斥的。但我正在用這種方式寫出來,以節省一點時間。如果你不明白我的意思,請問。
你看過Morris Inorder Traversal嗎? https://en.wikipedia.org/wiki/Tree_traversal#Morris_in-order_traversal_using_threading – msandiford
謝謝@msandiford。一個線程化的二叉樹([link](https://en.wikipedia.org/wiki/Threaded_binary_tree))在按順序訪問樹時將會很棒。不幸的是,改變樹佈局是沒有問題的。由於樹是一個前綴樹(aka Patricia trie),訪問它的最明智的方式是預定。出於純粹的好奇心(因爲我無法改變樹佈局):沒有線程二叉樹用於預先遍歷,或者是否存在? – Herb