将二叉树按照树结构输出
题目描述:
将任意一个二叉树按照树结构输出,根节点直接输出值,子节点随着层数的增加,每增加一层子节点值前面增加“–”,当不存在左右节点时输出null。
题目解析:
我们一定要明确无论二叉树的输出结果是什么形式,它都是在四种遍历的基础上进行的。若题目无额外要求,我们首先考虑前序遍历输出,因前序输出更符合人的正常思维。因此该题我们是在前序遍历的基础上对二叉树输出加以改进。
代码实现:
//BinTree接口
package bin_tree;
/**
* 二叉树的通用接口
* @param <E>
*/
public interface BinTree<E> {
void add(E e);
int size();
}
//BinSearchNewTree实现类
package bin_tree.bin_search_tree;
import bin_tree.BinTree;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class BinSearchNewTree<E extends Comparable> implements BinTree<E> {
class Node{
Object data;
Node left;
Node right;
public Node(Object data) {
this.data = data;
}
}
private Node root;
private int size;
//向二叉树中添加元素
@Override
public void add(E e) {
root=add(root,e);
}
/**
* 每插入一个元素返回修改树结构后的根节点,因只要知道二叉树的根节点就可遍历所有节点
* @param e
*/
private Node add(Node node,E e){
if(node==null){
Node newNode=new Node(e);
size++;
return newNode;
}
if(e.compareTo(node.data)>0){
node.right=add(node.right,e);
}
else if(e.compareTo(node.data)<0){
node.left=add(node.left,e);
}
return node;
}
@Override
public int size() {
return size;
}
//覆写toString()方法保证输出二叉树数值
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
tree2str(root);
return sb.toString();
}
//解决该题可从树的层数下手,使用树的前序遍历
public String tree2str(Node node){
StringBuilder res=new StringBuilder();
tree2str(root,0,res);
return res.toString();
}
private void tree2str(Node node,int depth,StringBuilder res){
//若根节点为空,输出null同时换行即可
if(node==null){
res.append("null"+"\n");
return;
}
//前序输出需首先输出数值
res.append(gerateGang(depth)+node.data+"\n");
//再递归遍历左子树
tree2str(node.left,depth+1,res);
//最后递归遍历右子树
tree2str(node.right,depth+1,res);
}
//该方法实现随着层数的不同,数值前面加的-个数不同
private String gerateGang(int depth){
StringBuilder sb=new StringBuilder();
for(int i=0;i<depth;i++){
sb.append("--");
}
return sb.toString();
}
//对二叉树的打印
public void print(){
System.out.println(tree2str(root));
}
}
//测试类
package bin_tree.bin_search_tree;
import bin_tree.BinTree;
public class Test {
public static void main(String[] args) {
BinTree<Integer> binTree=new BinSearchNewTree<>();
int[] num=new int[]{28,16,30,13,22,29,42,15};
for(int i=0;i<num.length;i++){
binTree.add(num[i]);
}
((BinSearchNewTree<Integer>) binTree).print();
}
}
输出结果:
28
--16
----13
null
------15
null
null
----22
null
null
--30
----29
null
null
----42
null
null
重点代码图解:
操作系统中递归实现图解: