给定一个树,要求一层一层的将树进行遍历
例如: 如图的树:
根据层次遍历得到的结果应该是:
A
B C
D E F
G H I J
自定义的树其孩子使用的是链表存储;存储的结果,定义如下
public class TreeNode<T> {
private T key;
public TreeNode<T> parent;
public List<TreeNode<T>> children;
}
所以在此遍历的时候,采用的是队列的方式,以及双指针的方式,来将遍历的结果存放到多个arrayList中的arrayList之中,即每一个list代表一行数据,最后将其打印出来即可。
遍历思想:
- 使用队列的方式来临时存储数据,从根节点开始遍历,没压进队列一个节点,就将其所有的子节点都压入到队列中;这样从队列头出来的数据就是根据树的节点从上到下、从左到右依次遍历了。
- 此外还要对遍历的数据分层,使用的是双指针的方式,一个指针指向上一层的最后的位置,当这一层的节点的父节点为上一层的最后一个就新建一个数组并将其放入到总的数组中。
代码;
public List<List<TreeNode<T>>> levelOrder(TreeNode<T> x) {
List<List<TreeNode<T>>> res = new ArrayList<>();
//使用双指针进行访问
TreeNode<T> last = x;
Queue<TreeNode<T>> q = new LinkedList<>();
q.add(x);
TreeNode<T> nNode = null;
List<TreeNode<T>> l = new ArrayList<>();
//根节点只有一个,先将root放入到第一个
res.add(l);
while (!q.isEmpty()) {
TreeNode<T> peek = q.peek();
if (peek.children != null) {
//将q的所有孩子放在队列中
for (TreeNode<T> node : peek.children) {
q.add(node);
nNode = node;
}
//将第一个弹出来
}
l.add(q.poll());
//如果弹出的是上一行的最后一个的话就创建新的数组
if (peek == last) {
l = new ArrayList<>();
res.add(l);
last = nNode;
}
}
return res;
}