二叉树的按层遍历并实现换行

时间:2021-07-26 11:15:40

二叉树是一个非常重要的数据结构,在好多的面试题中总会出现,大多数要求回答者实现在二叉树的按层遍历的同时实现换行,其实按层遍历很好想,但是要求换行输出的时候,很多时候就比较懵,无从下手,其实仔细想一想问题就会水落石出。


先构建节点类TreeNode,让他有一个String类型的数据值,一个节点类型的左孩子,一个节点类型的右孩子

package demo_datastruct;

public class TreeNode {
public String data;
public TreeNode leftChild;
public TreeNode rightChild;
public TreeNode(){

}
public TreeNode(String data){
this.data=data;
this.leftChild=null;
this.rightChild=null;
}
}

接下来就是定义节点,二叉树,遍历二叉树,一个三层的简单的二叉树

二叉树的按层遍历并实现换行

这里定义一个辅助队列,利用队列先进先出的特点可以简化遍历过程

        private TreeNode A = new TreeNode();
private TreeNode B = new TreeNode();
private TreeNode C = new TreeNode();
private TreeNode D = new TreeNode();
private TreeNode E = new TreeNode();
private TreeNode F = new TreeNode();
private Queue<TreeNode> q = new LinkedList<TreeNode>();

public void init() {
A.data = "1";
B.data = "2";
C.data = "3";
D.data = "4";
E.data = "5";
F.data = "6";
A.leftChild = B;
A.rightChild = C;
A.rightChild.leftChild = D;
A.rightChild.rightChild = E;
A.rightChild.leftChild.rightChild = F;
}
一个初始化方法用来设置数据值,和定义二叉树,这里用到了非常容易理解的定义二叉树的的方法,ABCDEF六个节点的数据值分别设置为123456

重要的遍历方法来了

public void Traversal(TreeNode node) {
        int i = 0;//当前行未打印的节点数
        int j = 0;//下一行的节点数
        if (node != null) {
            q.offer(node);
            i++;
            while (!q.isEmpty()) {
                i--;
                TreeNode t = q.poll();
                System.out.print(t.data);
                if (t.leftChild != null) {
                    j++;
                    q.offer(t.leftChild);
                }
                if (t.rightChild != null) {
                    j++;
                    q.offer(t.rightChild);
                }
                if (i == 0) {
                    System.out.println();
                    i = j;
                    j = 0;
                }
            }
        }else{
            return;
        }
    }

首先我们定义两个变量,分别用来记录当前行未打印的节点数,下一行的节点数,接下来开始遍历整个二叉树,先把根节点放入队列,这样当前节点数加一,执行队列判空判断,当队列不为空的时候执行循环语句,每当有左右孩子节点的时候,下一节点数++,执行换行的条件是,当前行未打印的节点数为0,执行换行,这样这一行打印完毕,到了下一行,之前我们记录的下一行的节点数就成了当前行未打印的节点数,执行一下赋值语句,这样就巧妙地完成了一行的遍历并实现了换行。

以下完整代码:

package demo_datastruct;

import java.util.LinkedList;
import java.util.Queue;

public class BinTree2 {
private TreeNode A = new TreeNode();
private TreeNode B = new TreeNode();
private TreeNode C = new TreeNode();
private TreeNode D = new TreeNode();
private TreeNode E = new TreeNode();
private TreeNode F = new TreeNode();
private Queue<TreeNode> q = new LinkedList<TreeNode>();

public void init() {
A.data = "1";
B.data = "2";
C.data = "3";
D.data = "4";
E.data = "5";
F.data = "6";
A.leftChild = B;
A.rightChild = C;
A.rightChild.leftChild = D;
A.rightChild.rightChild = E;
A.rightChild.leftChild.rightChild = F;
}

public void Traversal(TreeNode node) {
int i = 0;//当前行未打印的节点数
int j = 0;//下一行的节点数
if (node != null) {
q.offer(node);
i++;
while (!q.isEmpty()) {
i--;
TreeNode t = q.poll();
System.out.print(t.data);
if (t.leftChild != null) {
j++;
q.offer(t.leftChild);
}
if (t.rightChild != null) {
j++;
q.offer(t.rightChild);
}
if (i == 0) {
System.out.println();
i = j;
j = 0;
}
}
}else{
return;
}
}

public static void main(String[] args) {
BinTree2 b = new BinTree2();
b.init();
b.Traversal(b.A);
}
}

输出结果:

二叉树的按层遍历并实现换行