二叉树的遍历-按层次遍历
- 通过先序遍历及中序遍历结果构造二叉树
- 按层级遍历二叉树
import java.util.Arrays;
import java.util.Scanner;
/**
* Created by xiaolong_ma on 2017/4/1.
* 输入:
* 节点数
* 先序遍历结果
* 后序遍历结果
* 例如:
* 3
* 1 2 3
* 2 1 3
*/
public class TreeLearn0 {
public static void main(String[] args) {
Node node = new Node();
Scanner sc=new Scanner(System.in);
int l=sc.nextInt();
int[] pre=new int[l];
int[] mid=new int[l];
for (int i = 0; i <l ; i++) {
pre[i]=sc.nextInt();
}
for (int i = 0; i <l ; i++) {
mid[i]=sc.nextInt();
}
getTree(node,pre,mid);
System.out.println("先序遍历结果:");
printPre(node);
System.out.println("\n中序遍历结果:");
printmid(node);
System.out.println("\n按层级遍历结果:");
printByLayer(node);
}
public static void getTree(Node node,int[] pre,int[] mid){
if(pre.length==0){
node=null;
return;
}else{
node.i=pre[0];
int pos=0;
for (int i = 0; i < mid.length ; i++) {
if(mid[i]==pre[0]){
pos=i;
break;
}
}
int[] tempPre0= Arrays.copyOfRange(pre,1,pos+1);
int[] tempMid0= Arrays.copyOfRange(mid,0,pos);
int[] tempPre1=Arrays.copyOfRange(pre,pos+1,pre.length);
int[] tempMid1=Arrays.copyOfRange(mid,pos+1,mid.length);
if(tempMid0.length!=0) {
node.left=new Node();
getTree(node.left, tempPre0, tempMid0);
}
if(tempMid1.length!=0) {
node.right=new Node();
getTree(node.right, tempPre1, tempMid1);
}
}
}
public static void printPre(Node node) {
if(node==null){
return;
}else {
System.out.print(node.i+" ");
printPre(node.left);
printPre(node.right);
}
}
public static void printmid(Node node){
if (node ==null){
return;
}else {
printmid(node.left);
System.out.print(node.i+" ");
printmid(node.right);
}
}
public static boolean printAtLayer(Node node,int level){
if(node==null||level<0)
return false;
if (level==0) {
System.out.print(node.i + " ");
return true;
}
else {
return !(printAtLayer(node.left,level-1)==false&printAtLayer(node.right,level-1)==false);
}
}
public static void printByLayer(Node node){
for (int i = 0; ; i++) {
if(!printAtLayer(node,i)){
return;
}
}
}
static class Node{
int i;
Node left;
Node right;
}
}