一種簡潔的非遞歸遍歷樹的常用算法


樹形結構是常用的數據結構,要遍歷他一般使用遞歸算法。遞歸的好處是代碼簡潔;壞處是效率低,容易堆棧溢出。

要實現非遞歸遍歷樹,我們使用棧結構,基本實現思路是:從根開始逐層遍歷。

思路:

1)將根節點壓棧

2)循環檢查棧是否為空

  (1)如果為空,循環結束(遍歷也結束了)

  (2)如果不為空,出棧一個節點

3) 檢查該節點是否是要找的節點

  (1)如果是,退出循環,遍歷結束

  (2)如果不是,將該元素的下一層節點全部壓棧。

4)繼續執行2)

偽代碼:

Stack<Node> stack=new Stack<Node>();
stack.push(root);
while(!stack.isEmpty())
{
Node n=stack.pop();
if(isMyNode(node))
{
//找到了
break;
}
else
{
for(int i=0;i<n.Children;i++)
{
stack.push(n.Children[i]);
}
}
}

整個代碼還算簡潔:兩個循環,一個棧結構搞定。其中循環的結束條件是關鍵:棧是否為空!

感悟:

現代語言的抽象能力只能到while循環層次,循環就是機器層面的最高級形式了,距離人的語言也太遠了吧。

這也是算法的意義——在機器和人之間架起一座橋梁。

難道人的思維經過底層分解后也是這種簡單的形式?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM