樹形結構是常用的數據結構,要遍歷他一般使用遞歸算法。遞歸的好處是代碼簡潔;壞處是效率低,容易堆棧溢出。
要實現非遞歸遍歷樹,我們使用棧結構,基本實現思路是:從根開始逐層遍歷。
思路:
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循環層次,循環就是機器層面的最高級形式了,距離人的語言也太遠了吧。
這也是算法的意義——在機器和人之間架起一座橋梁。
難道人的思維經過底層分解后也是這種簡單的形式?