第一部分:二叉树的层序遍历(队列实现)
一、定义二叉树结点Node类
package binaryTree.bean;
/*
* 二叉树的结点
*/
public class Node {
private int data;
private Node left;
private Node right;
public Node(int data,Node left,Node right){
this.data = data;
this.left = left;
this.right = right;
}
public int getData(){
return data;
}
public void setData(int data){
this.data = data;
}
public Node getLeft(){
return left;
}
public void setLeft(Node left){
this.left = left;
}
public Node getRight(){
return right;
}
public void setRight(Node right){
this.right = right;
}
}
二、层序遍历(不换行,不打印行号)
/*
* 层序遍历
* 每一层都是从左到右的遍历输出,借助于队列实现。offer()为入队,poll()为出队
* 1.先将根节点入队
* 2.将队首节点赋为cur,然后出队并打印,
* 如果当前结点cur的左结点不为空则将左结点入队,然后若右结点不为空则将右结点入队。
* 3.重复步骤2直到队空
*/
private static void levelOrderTraverse(Node head){
Queue<Node> queue = new LinkedList<>();
queue.offer(head);
while(!queue.isEmpty()){
Node current = queue.poll();
System.out.print(current.getData()+” “);
if(current.getLeft()!=null){
queue.offer(current.getLeft());
}
if(current.getRight()!=null){
queue.offer(current.getRight());
}
}
}
三、层序遍历(换行,不打印行号)
/*
* 按行打印的层序遍历(不打印行号,只换行)
* 在层序遍历的基础上,增加了last与nlast两个类型为Node的变量
* last:表示正在打印的当前行的最右结点
* nlast:表示下一行的最右结点
* 初始时last、nlast都赋值为根节点
* 每次将nlast指向插入队列的元素,令当前出队的元素为cur,每一轮
* 都要判断cur是否等于last,若等于则说明last为当前行最右结点,nlast为
* 下一行最右结点,故要打印换行并将nlast赋值给last
*/
private static void levelOrderTraverse2(Node head){
Node last = head;
Node nlast = head;
Queue<Node> queue = new LinkedList<>();
queue.offer(head);
while(!queue.isEmpty()){
Node current = queue.poll();
System.out.print(current.getData()+” “);
if(current.getLeft()!=null){
queue.offer(current.getLeft());
nlast = current.getLeft();
}
if(current.getRight()!=null){
queue.offer(current.getRight());
nlast = current.getRight();
}
if(last == current){
System.out.println();
last = nlast;
}
}
}
四、层序遍历(换行并打印行号)
/*
* 在每一行的行首打印行号的层序遍历(打印行号且换行)
*/
private static void levelOrderTraverse3(Node head){
Node last = head;
Node nlast = head;
int row = 1;
Node current = head;
Queue<Node> queue = new LinkedList<>();
queue.offer(head);
while(!queue.isEmpty()){
//打印行号并将last = nlast;的操作移到这里
if(last == current){
System.out.print(“第”+row+”行: “);
last = nlast;
}
current = queue.poll();
System.out.print(current.getData()+” “);
if(current.getLeft()!=null){
queue.offer(current.getLeft());
nlast = current.getLeft();
}
if(current.getRight()!=null){
queue.offer(current.getRight());
nlast = current.getRight();
}
if(last == current){
//System.out.print(“第”+row+”行”);
System.out.println();
row++;
//last = nlast;
}
}
}
第二部分、求二叉树的高度(深度)
方法一:非递归,就用上面写的层序遍历即可。
方法二:递归,代码非常简单
/*
* 用递归法求二叉树的高度
*/
private static int getHeight(Node head){
if(head==null){
return 0;
}
int left = getHeight(head.getLeft());
int right = getHeight(head.getRight());
return Math.max(left, right) + 1;
}
第三部分、判断是否为平衡二叉树(AVL树)
AVL树:
1.空树是平衡二叉树
2.如果一棵树不为空,并且其中所有的结点都满足各自的左子树与右子树的高度差都不超过一。
/*
* 判断一棵树是否为平衡二叉树
*/
private static boolean isBalanced = true;
private static boolean isBalanced(Node head){
int depth = getDepth(head);
System.out.println(“树的深度为:”+depth);
return isBalanced;
}
private static int getDepth(Node head){
if(head == null)
return 0;
int left = getDepth(head.getLeft());
int right = getDepth(head.getRight());
if(Math.abs(left-right)>1){
isBalanced = false;
}
return Math.max(left, right) + 1;
}
总结:我是实战派,废话不多说直接上的代码,均能够成功运行。
思路:由二叉树的前中后序遍历(见我的上一篇文章)想到层序遍历,由层序遍历想到求树的高度,再由树的高度联想到平衡二叉树(左右字数高度差的绝对值小于等于1)。