面试题:分层打印二叉树
需求:
树的结构
// 1 // / \ // 2 3 // / \ / \ // 4 5 6 7
需要按照如下的方式进行打印:
1 2 , 3 4 , 5 , 6 , 7
分析:
本文按照非递归的方式进行打印,其中的关键就是:
1):使用队列保存当前要打印的节点
2):当前层打印完毕后换行
代码:
public static void printTree(BineryTreeNode root){ //首先做一个安全的判断 if(root == null){ return ; } //用一个队列存储当前要打印的节点 Queue<BineryTreeNode> queue = new LinkedList<BineryTreeNode>(); int current; //当前层还未打印的节点 int next ; //下一层的节点个数 queue.add(root);//开始将头节点放入队列 current = 1 ; next = 0 ; while (!queue.isEmpty()){//如果当前的队列不为空 final BineryTreeNode currentNode = queue.poll();//弹出当前队列的值 System.out.print(currentNode.data + " "); current -- ; //打印左子树 if(currentNode.left != null){ queue.add(currentNode.left); next ++ ; } //打印右子树 if(currentNode.right != null){ queue.add(currentNode.right); next ++ ; } if(current == 0){//如果current为0,说明当前层打印完毕 System.out.println();//换行 current = next ;//下一节点没打印的个数就是:左子树 + 右子树 next = 0 ;//将next至0,从下层开始继续遍历 } } }
全部代码:
package demo2; import jdk.nashorn.internal.ir.BinaryNode; import java.util.LinkedList; import java.util.Queue; /** * Created by angel */ class BineryTreeNode{ public int data ; public BineryTreeNode left ; //树的左节点 public BineryTreeNode right ; //树的右节点 public BineryTreeNode(int data){ this.data = data ; } @Override public String toString() { return "[data" + data + " , left = " + left + " , right = "+ right +"]" ; } } public class PrintBineryTree { public static void main(String[] args) { BineryTreeNode node1 = new BineryTreeNode(1); BineryTreeNode node2 = new BineryTreeNode(2); BineryTreeNode node3 = new BineryTreeNode(3); BineryTreeNode node4 = new BineryTreeNode(4); BineryTreeNode node5 = new BineryTreeNode(5); BineryTreeNode node6 = new BineryTreeNode(6); BineryTreeNode node7 = new BineryTreeNode(7); node1.left = node2 ; node1.right= node3 ; node2.left = node4 ; node2.right = node5 ; node3.left = node6 ; node3.right = node7 ; printTree(node1); } public static void printTree(BineryTreeNode root){ //首先做一个安全的判断 if(root == null){ return ; } //用一个队列存储当前要打印的节点 Queue<BineryTreeNode> queue = new LinkedList<BineryTreeNode>(); int current; //当前层还未打印的节点 int next ; //下一层的节点个数 queue.add(root);//开始将头节点放入队列 current = 1 ; next = 0 ; while (!queue.isEmpty()){//如果当前的队列不为空 final BineryTreeNode currentNode = queue.poll();//弹出当前队列的值 System.out.print(currentNode.data + " "); current -- ; //打印左子树 if(currentNode.left != null){ queue.add(currentNode.left); next ++ ; } //打印右子树 if(currentNode.right != null){ queue.add(currentNode.right); next ++ ; } if(current == 0){//如果current为0,说明当前层打印完毕 System.out.println();//换行 current = next ;//下一节点没打印的个数就是:左子树 + 右子树 next = 0 ;//将next至0,从下层开始继续遍历 } } } }