免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
階層的バイナリツリー
ノートの前提:
実装コード(復刻版):
最後のリンクより、オリジナルのフィルムで
package com.bjsxt.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 二叉树的分层
*/
public class LevelOfBiTree {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> res =new ArrayList<List<Integer>>();
//使用List<List<Integer>>,一层就是一个list,再把这些list整体放入List中,达到分层的作用
LinkedList<Node> queue = new LinkedList<Node>();
//树为空的情况
if (root == null) {
return res;
}
queue.offer(root);
while (queue.size() != 0) {
List<Integer> l = new ArrayList<Integer>();//暂存每层的值
int size = queue.size();
for (int i = 0; i < size; i++) {
Node temp = queue.poll();//移除此层的根
l.add(temp.val);
//将此层根的孩子们全部添加到queue中,作为下一层的根
if (temp.left != null) {
queue.offer(temp.left);
}
if (temp.right != null) {
queue.offer(temp.right);
}
}
res.add(l);
}
return res;
}
}
テストブロック:
public class Test {
public static void main(String[] args) {
//测试--打印二叉树每层的节点
BiTreeTraversing tree = new BiTreeTraversing();
tree.getResult();
Node root=tree.getPack().get(0);//整棵树的根节点
//测试--二叉树层序遍历,分层打印
LevelOfBiTree lobt=new LevelOfBiTree();
List<List<Integer>> res=lobt.levelOrder(root);
//使用迭代器遍历双层list
for (Iterator iterator = res.iterator(); iterator.hasNext();) {
List<Integer> list = (List<Integer>) iterator.next();
System.out.println(list.toString());
}
}
}
テスト結果:
[1]
[2, 3]
[4, 5, 6]
[7]