package com.yuzhiyun;
import java.util.LinkedList;
import java.util.Queue;
import com.yuzhiyun.FindPathInBinaryTree.BinaryTreeNode;
public class BinaryTreeLevelPrint {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 10
// / \
// 5 12
// /\
// 4 7
BinaryTreeNode root = new BinaryTreeNode();
root.value = 10;
root.left = new BinaryTreeNode();
root.left.value = 5;
root.left.left = new BinaryTreeNode();
root.left.left.value = 4;
root.left.right = new BinaryTreeNode();
root.left.right.value = 7;
root.right = new BinaryTreeNode();
root.right.value = 12;
System.out.println("递归层次遍历二叉树");
for(int i=1;;i++) {
if(-1==printLevel(root, i))
break;
System.out.println();
}
System.out.println("非递归层次遍历二叉树");
printTreeWithQueue(root);
System.out.println();
System.out.println("非递归层次遍历二叉树**且要求换行");
printTreeWithQueueChangeLine(root);
}
/**
* 递归层次遍历二叉树
* @param node
* @param level 想打印第几层
* @return 根据返回值来判断是否已经可以结束打印了,因为我们没有算出二叉树的高度。
*/
static int printLevel(BinaryTreeNode node,int level){
if(null==node)
return -1;
if(1==level) {
System.out.print(node.value+" ");
return 0;
}
else {
int leftResult=printLevel(node.left, level-1);
int rightResult=printLevel(node.right, level-1);
if(leftResult==-1 && rightResult==-1)
return -1;
else
return 0;
}
}
/**
* 用队列辅助层次打印二叉树
* 其思想就是利用队列的先进先出的特点,逐个将左右结点放入队列中
*/
static void printTreeWithQueue(BinaryTreeNode root) {
if(null==root)
return;
Queue<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
BinaryTreeNode node=queue.poll();
System.out.print(node.value+" ");
if(null!=node.left)
queue.offer(node.left);
if(null!=node.right)
queue.offer(node.right);
}
}
/**
* 非递归的同时,要求每打印一层节点就换行
*/
static void printTreeWithQueueChangeLine(BinaryTreeNode root) {
if(null==root)
return;
Queue<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
queue.offer(root);
//下一层的节点数量
int nextLevelNodeNum=0;
//这一层还未打印的节点的数量
int toBePrintNodeNum=1;
while (!queue.isEmpty()) {
BinaryTreeNode node=queue.poll();
System.out.print(node.value+" ");
toBePrintNodeNum--;
if(null!=node.left) {
queue.offer(node.left);
nextLevelNodeNum++;
}
if(null!=node.right) {
queue.offer(node.right);
nextLevelNodeNum++;
}
if(0==toBePrintNodeNum) {
System.out.println();
toBePrintNodeNum=nextLevelNodeNum;
nextLevelNodeNum=0;
}
}
}
}
二叉树递归与非递归层次遍历
最新推荐文章于 2022-04-14 23:05:52 发布