Java 按深度打印二叉树

二叉树的打印程序需要用到队列来完成,在Java中使用LinkedList类即可。具体的代码如下所示:

public class TreeNode {
	private int value;
	private TreeNode ltr;
	private TreeNode rtr;
	public TreeNode addNode(int value) {//给一个树加一个节点,this表示树根
		TreeNode root =this;
		if (this.getValue() > value) {
			if(this.getLtr()!=null) {
				this.setLtr(this.getLtr().addNode(value));
			}
			else {
				TreeNode tnew = new TreeNode(value);
				tnew.setLtr(null);
				tnew.setRtr(null);
				this.setLtr(tnew);
			}
		} else {
			if(this.getRtr()!=null) {
				this.setRtr(this.getRtr().addNode(value));
			}
			else {
				TreeNode tnew = new TreeNode(value);
				tnew.setLtr(null);
				tnew.setRtr(null);
				this.setRtr(tnew);
			}
		}
		return root;
	}
	
	public int getValue() {
		return value;
	}
	public void setValue(int value) {
		this.value = value;
	}
	public TreeNode getLtr() {
		return ltr;
	}
	public void setLtr(TreeNode ltr) {
		this.ltr = ltr;
	}
	public TreeNode getRtr() {
		return rtr;
	}
	public void setRtr(TreeNode rtr) {
		this.rtr = rtr;
	}
	
	public TreeNode() {
	}

	public TreeNode(int value) {
		this.value = value;
	}
	
}
在TreeNode类中除了成员之外还有一个添加节点的函数,用递归即可完成数的创建。

测试类如下,打印每一层的树节点后,会换行后打印下一深度的节点。

import java.util.LinkedList;
import java.util.Scanner;

public class TreePrinter {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		String[] set = s.split(" ");
		TreeNode t = new TreeNode(Integer.parseInt(set[0]));
		for (int i = 1; i < set.length; i++) {
			t.addNode(Integer.parseInt(set[i]));
		}
		sc.close();
		System.out.println("树已经创建完毕,按深度打印的结果为:");
		LinkedList<TreeNode> lini = new LinkedList<TreeNode>();
		lini.add(t);
		while(lini.size()!=0) {
			lini=printTreeInDepth(lini);
		}
	}

	private static LinkedList<TreeNode> printTreeInDepth(LinkedList<TreeNode> l) {
		// l是当前的队列,每次要把它打完,然后对于其中的元素,加入左右儿子进入一个新的队列,返回这个队列
		LinkedList<TreeNode> res = new LinkedList<TreeNode>();// 要返回这个队列
		for (TreeNode tn : l) {
			System.out.print(tn.getValue() + " ");
			if (tn.getLtr() != null) {
				res.add(tn.getLtr());
			}
			if (tn.getRtr() != null) {
				res.add(tn.getRtr());
			}
			
		}
		System.out.println();
		return res;
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值