从上往下打印出二叉树的每个节点,同层节点从左至右打印
代码
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
static List<Integer> getTreeNodeFromTopToBottom(TreeNode root) {
if (root == null) {
return null;
}
List<Integer> result = Lists.newArrayList();
// 辅助队列,利用其先入先出,在树的遍历过程中,保证上层节点先于下层节点,左节点先于右节点的顺序被放入取出
Queue<TreeNode> queue = Lists.newLinkedList();
// 将根节点放入队列尾部
queue.add(root);
TreeNode temp = null;
// 辅助队列为空,说明遍历完整棵树
while (!queue.isEmpty()) {
// 从队列取出头部元素
temp = queue.remove();
// 将其放入结果集合中
result.add(temp.val);
// 如果其左子节点不为null,则放入队列尾部,这样必然先于右子节点从队列中取出
if (temp.left != null) {
queue.add(temp.left);
}
// 如果其右子节点不为null,则放入队列尾部
if (temp.right != null) {
queue.add(temp.right);
}
}
return result;
}
public static void main(String[] args) {
TreeNode root = buildTree();
List<Integer> result = getTreeNodeFromTopToBottom(root);
// 结果是 5 3 18 2 4
for (Integer val : result) {
System.out.print(val + " ");
}
}
/**
* 创建tree:</br>
* 5</br>
* 3 18</br>
* 2 4</br>
* @return
*/
private static TreeNode buildTree(){
TreeNode root = new TreeNode(5);
TreeNode left = new TreeNode(3);
TreeNode left1 = new TreeNode(2);
TreeNode right1 = new TreeNode(4);
left.left = left1;
left.right = right1;
TreeNode right = new TreeNode(18);
root.left = left;
root.right = right;
return root;
}