二叉树的遍历-按层次遍历

二叉树的遍历-按层次遍历

  1. 通过先序遍历及中序遍历结果构造二叉树
  2. 按层级遍历二叉树
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){ //找最终的情况,直接return
            node=null; //实际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);

            //**好坑的java 要在前面初始化,而且在后面不能将指向的对象置null(这个好像有问题啊)?
            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);
        }
    }

    //打印某一层(这个地方很有趣,打印第level层通过减的方式)
    public static boolean printAtLayer(Node node,int level){
        if(node==null||level<0) //正常情况下到0就return了,这个只是来检测是否为null
            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)){ //利用node为null的情况
                return; //break也对
            }
        }
    }

    static class Node{
        int i;
        Node left;
        Node right;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值