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

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


先构建节点类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);
	}
}

输出结果:


posted @ 2017-11-10 21:29  In_new  阅读(461)  评论(0编辑  收藏  举报