树形结构是常用的数据结构,要遍历他一般使用递归算法。递归的好处是代码简洁;坏处是效率低,容易堆栈溢出。
要实现非递归遍历树,我们使用栈结构,基本实现思路是:从根开始逐层遍历。
思路:
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循环层次,循环就是机器层面的最高级形式了,距离人的语言也太远了吧。
这也是算法的意义——在机器和人之间架起一座桥梁。
难道人的思维经过底层分解后也是这种简单的形式?