zoukankan      html  css  js  c++  java
  • 二叉树的按层遍历并实现换行

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


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

    输出结果:


  • 相关阅读:
    学习方法与经验总结
    工具综合症?资料收集狂?
    SpringMVC 过滤器Filter使用解析
    Spring 管理Filter和Servlet
    pom.xml配置详解
    开发Java web应用程序的介绍
    java web构建学习(概念基础)
    题目1474:矩阵幂
    题目1473:二进制数
    Python strip()方法
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816603.html
Copyright © 2011-2022 走看看