假設我們有一棵樹,每個節點都有一組預定的傳出節點。是否有可能提出一個快速的方式/優化來計算給定級別值的葉節點數量?如果有人能夠提出任何想法/鏈接/資源來做同樣的事情,那將會很棒。計算樹中的葉節點
計算樹中的葉節點
回答
不,你仍然需要遍歷整個樹。沒有辦法只從樹的每個節點的子節點數量來預測精確的結構 - 或近似它。
除此之外:只保留一個計數器並在每次插入時更新它。更簡單並且不會改變任何操作的時間複雜度,除了計算樹葉數量,其將減少到O(1)
。
你可以提供一個簡單的僞代碼來說明如何計算O(1)次葉節點的「數量」嗎? –
@ N.M。正如我在答案中已經寫過的那樣:只用葉子的計數器。我不認爲這需要任何代碼來解釋。代碼幾乎是一個樹的完整實現 – Paul
這實際上可以變得非常艱難的事情。由於它改變了什麼是編程語言,什麼是輸入數據結構,是樹二進制還是一般樹(任意數量的子樹),樹的大小。
最普遍的想法是從根開始運行DFS或BFS,以獲取每個節點級別,然後創建一個集合列表,其中每個集合包含單個級別的節點。該集可以是任何結構,標準列表是好的。
假設你在C++中工作,如果你需要性能(甚至比C更好),那麼這是很好的,如果不是最好的實際選擇的話。
比方說,我們有一個通用樹,輸入結構就像您提到的那樣是鄰接表。
//nodes are numbered from zero to N-1
vector<vector<int>> adjList;
然後,您運行BFS或DFS,要麼爲樹,要爲每個節點保留一個級別。下一個節點的級別是其父級加一級。
一旦你發現了關卡,你就把這個節點放在這裏。
vector<vector<int>> nodesPartitionedByLevels(nodeCount);
//run bfs here
//inside it you call
nodesPartitionedByLevels[level].push_back(node)
就是這樣。
然後,當您擁有這些關卡時,您會迭代該關卡上的所有節點,並檢查鄰接關係列表是否包含任何節點。您可以撥打adjList[node].empty()
。如果真的比那是葉節點。
- 1. 計算二叉樹中的節點數和葉節點數
- 2. 在沒有葉子/節點的二叉樹中計算節點?在計劃中?
- 3. 計算樹中的節點
- 4. 如何計算二叉搜索樹中的非葉節點?
- 5. 如何計算extjs樹中節點的葉數?
- 6. 計算B +樹葉節點的阻塞因子
- 7. 計算ocaml中樹中的節點數
- 8. GWT細胞樹 - 葉節點
- 9. 計算樹狀圖樹葉的排序
- 10. T-SQL CTE計算所有葉節點
- 11. 計算樹中的左子節點
- 12. 計算二叉樹中的節點
- 13. PHP計算樹中的所有節點
- 14. B +樹中的非葉節點
- 15. 訪問樹中的節點/葉子
- 16. 計數高度平衡樹的葉節點的計數函數
- 17. 在二叉樹中計算節點
- 18. 如何統計樹中給定節點之前的葉子?
- 19. 莖和葉節點算法
- 20. 在二叉樹的葉節點的
- 21. 二叉樹中距給定節點最近的葉節點
- 22. 樹類的實現與節點和葉
- 23. L葉節點的二叉樹高度
- 24. B +樹的葉節點大小
- 25. 計數JSON葉節點
- 26. 在樹結構中,如何命名樹,節點,樹葉?
- 27. 保存AVL樹中節點下的樹葉數量
- 28. 計算二叉樹節點數
- 29. 計算二叉樹內部節點
- 30. 有效計算樹中存儲的樹葉
你的意思是說,每個節點都有「d」個孩子? –
@SalvadorDali不一定 –
然後有沒有簡單的方法來計算它(通過容易我的意思是沒有看整個樹),因爲代碼實際上很容易。 –