-4
A
回答
2
一般樹的InOrder遍歷沒有意義。由於沒有「訂單」,您應該訪問當前節點。 InOrder只對二叉樹有意義。
對於InOrder對於通用樹有意義,您必須定義當前節點應該訪問的順序。由於唯一有兩個選擇是有意義的,即首先訪問當前節點(Pre-訂單)或最後一個(後期訂單)。因此,對一般樹的InOrder並沒有多大意義。
當然,如果您的普通樹具有特定的結構,那麼InOrder可以有意義。如果你總是有第3個孩子留和所有其他人是正確的,然後你的算法是這樣的......
inorder(node)
if node == null then return
inorder(node.first)
inorder(node.second)
inorder(node.third)
visit(node)
foreach (remainingNode in RemainingNodes)
inorder(remainingNode)
通用代碼擴展方法...
static public IEnumerable<Node<T>> InOrder<T>(this Node<T> thisNode)
{
var list = new List<Node<T>>();
IEnumerable<Node<T>> leftNodes;
IEnumerable<Node<T>> rightNodes;
if (thisNode.Children == null)
{
leftNodes = new List<Node<T>>();
rightNodes = new List<Node<T>>();
}
else
{
leftNodes = thisNode.Children.Take((int)Math.Ceiling(thisNode.Children.Count()/2.0)).ToList();
rightNodes = thisNode.Children.Skip(leftNodes.Count()).ToList();
}
if (leftNodes.Any())
{
foreach (var child in leftNodes)
{
list.AddRange(child.InOrder());
}
}
list.Add(thisNode);
if (rightNodes.Any())
{
foreach (var child in rightNodes)
{
list.AddRange(child.InOrder());
}
}
return list;
}
1
的按序遍歷要求的節點順序
- 留下來參觀
- 這
- right
對於非二叉樹,這種行爲沒有意義,因爲沒有左或右專用節點。正如凱文所說,它只有真的是有意義的執行前序遍歷或後序遍歷;然而,如果你想執行一個In-Order-esque遍歷,你可以訪問一半的子節點,這個節點,然後是另一半。不過,這並不是按照順序遍歷的精神。
例如,假設您的節點有5個孩子。這將使中序遍歷:
- 孩子1
- 孩子2
- 孩子3
- 這
- 孩子4
- 孩子5
(只是爲了着想的論點。從技術上說,孩子3,這可能互換,但也會出現同樣的問題)
如果孩子5,然後刪除,在序遍歷是:
- 孩子1
- 孩子2
- 這
- 孩子3
- 孩子4
和我固有順序已經改變。但是,如果你要維護兩個孩子的列表:一個是你的leftChildren
,另一個是rightChildren
,那麼按順序遍歷就像它在二叉樹中一樣有意義。然而,如何選擇哪個孩子進入哪個列表完全是另一個問題。
編輯:由於它似乎要繼續這個問題,您可以使用像這樣做:
public IEnumerable<Node<T>> InOrder()
{
if (Children != null)
{
for (int i = 0; i < Children.length; i++)
{
if (i == Children.length/2)
{
yield return this;
}
foreach (var node in Children[i].InOrder())
{
yield return node;
}
}
}
}
相關問題
- 1. 我該怎麼做?
- 2. 我該怎麼做?
- 3. 我該怎麼做MongoDB中
- 4. 我該怎麼做WKWebView
- 5. 我該怎麼做(遊戲)?
- 6. 我應該怎麼做?
- 7. 我該怎麼做Asp.Net?
- 8. regexp freebie ...我該怎麼做?
- 9. 反思?我該怎麼做?
- 10. 我該怎麼做PyQt4?
- 11. 我該怎麼做,我應該
- 12. 這是什麼叫,我該怎麼做?
- 13. 我想運行「HttpAsyncTask」...我該怎麼做?
- 14. Eclipse交叉編譯...我該怎麼做?
- 15. 我該怎麼做認證在Android
- 16. 我該怎麼做<a href>?
- 17. list.setGrouped(true)不工作?我該怎麼做?
- 18. WCHAR to String,我該怎麼做?
- 19. 生成S函數我該怎麼做
- 20. 我該怎麼做 - 動畫菜單
- 21. 我該怎麼做呢?用C
- 22. XML到XSL我該怎麼做錯了
- 23. PHP架構:我該怎麼做?
- 24. 我該怎麼做頁面導航ASP.net
- 25. 我該怎麼做queryOrdered(bychild)呢?
- 26. 我該怎麼做setOnClickListener在片段
- 27. UnderscoreJS嵌套模板:我該怎麼做?
- 28. 我該怎麼做才能擁有
- 29. 用戶輸入,我們該怎麼做?
- 30. 作爲cast.receiver.RemoteMedia.NAMESPACE,我該怎麼做?
那麼你看過http://en.wikipedia.org/wiki/Tree_traversal#爲了? –
請告訴我們你已經擁有的東西以及迄今爲止嘗試過的東西。 – aevitas
中序遍歷只適用於* binary *樹。如果你有N個子節點,那麼「inorder」應該是什麼意思? – Jon