剑指offer-层序打印二叉树

01 题目

给一个二叉树,从上到下按照层序打印二叉树。

剑指offer-层序打印二叉树_第1张图片

 

层序遍历结果位 1,2,3,4,5,6,7,8

02 解题&动图展示

用辅助队列完成。

根节点首先到队列里面排队,等待输出。

根节点被输出,将根节点的子孩子入队排队等待输出。

剑指offer-层序打印二叉树_第2张图片

红色为已经入队的元素

文字描述过程

1.将跟节点1,放入队列中。

队列:1。

输出元素:

2.删除队首元素1,并输出,将1的两个子节点2,3入队。

队列:2,3。

输出元素:1

3.删除队首元素2,并输出,将2的两个子节点4,5,入队。

队列:3,4,5

输出元素:1,2

4.删除队首元素3,并输出,将3的两个孩子节点6,7,入队。

队列:4,5,6,7

输出元素:1,2,3

5.删除队首元素4,并输出,4无孩子节点,不入队列。

队列:5,6,7

输出元素:1,2,3,4

6.删除队首元素5,并输出,5无孩子节点,不入队列。

队列:6,7

输出元素:1,2,3,4,5

7.删除队首元素6,并输出,6的孩子节点8入列。

队列:7,8

输出元素:1,2,3,4,5,6

8.删除队首元素7,并输出,7无孩子节点,不入队列。

队列:8

输出元素:1,2,3,4,5,6,7

9.删除队首元素8,并输出,8无孩子节点,不入队列。

队列:

输出元素:1,2,3,4,5,6,7,8

队列为空,跳出循环。

03 总结&代码

1.首先将根节点入队列。

2.循环遍历删除队列元素,并且输出。(1)如果删除元素有孩子节点则入队。否则继续删除队首元素操作。

3.队列为空结束循环。

 

public class 面试题23层序打印二叉树 {
  public static void printBinaryTree(BinaryTreeNode binaryTree) {
    if (binaryTree == null) {
      return;
    }
    Queue queue = new LinkedBlockingQueue<>();
    queue.add(binaryTree);
    while (!queue.isEmpty()) {
      BinaryTreeNode tmpTreeNode = queue.remove();
      System.out.print(tmpTreeNode.value + " ");
      if (tmpTreeNode.leftChild != null) {
        queue.add(tmpTreeNode.leftChild);
      }
      if (tmpTreeNode.rightChild != null) {
        queue.add(tmpTreeNode.rightChild);
      }
    }
  }

  public static void main(String[] args) {
    BinaryTreeNode treeNode7 = new BinaryTreeNode(null, null, 7);
    BinaryTreeNode treeNode6 = new BinaryTreeNode(null, null, 6);
    BinaryTreeNode treeNode5 = new BinaryTreeNode(treeNode7, null, 5);
    BinaryTreeNode treeNode4 = new BinaryTreeNode(null, null, 4);
    BinaryTreeNode treeNode3 = new BinaryTreeNode(null, null, 3);

    BinaryTreeNode treeNode2 = new BinaryTreeNode(treeNode5, treeNode6, 2);
    BinaryTreeNode treeNode1 = new BinaryTreeNode(treeNode3, treeNode4, 1);
    BinaryTreeNode treeNode = new BinaryTreeNode(treeNode1, treeNode2, 0);
    printBinaryTree(treeNode);
  }
}

 

你可能感兴趣的:(算法和数据结构)