一、前言。
整理了一下N叉树的遍历算法。当然,递归算法简单易懂,是树遍历的首选。但是,试着用迭代去实现,是一种思维的开拓。也学到了栈和队列的一些应用。
这里用LeetCode上的题目作为例子,用Java实现。语言和遍历内容不是重点,可以根据需要灵活变化,重要的是其中的一些整体思路和条件判断。
简单起见:树的节点实现如下,
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
}
二、先序遍历
1. 思路:
前序遍历的特点是 根->左->右(左右指子节点顺序),因为当进入左子树之后,我们没有办法回到根,所以必须记录我们的访问路径。这是一种回溯的思想。当某个子树访问完之后,我们回溯到其父节点进入其兄弟子树。回溯经常是由栈实现的。每次遇到一个节点,先访问,再处理其子节点。子节点的访问顺序是从左到右,所以必须从右到左进栈。整理一下,我们便可以得到解法:
(1)根节点进栈。
(2)弹出栈顶元素,对其进行操作。再对其子节点从右到左进栈,直到栈为空,遍历结束。
2.实现:
class Solution {
//迭代版
public List<Integer> preorder(Node root){
List<Integer> list =new ArrayList<>();
if(root==null)
return list;
Stack<Node> stack=new Stack