打赏

网易:层次遍历二叉树

题目描述

分层遍历二叉树
用java实现树结构,分层遍历二叉树。给定一棵二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层单独输出一行),每一层要求访问的顺序为从左到右,再按照相同规则从下至上遍历一遍,树节点定义如下
class Node {
int data;
Node left;
Node right;
}
输入描述
图:
        __1__
       /     \
    __2__     3__
   /     \       \
  4     __5__     6
       7     8
上面的输入为:1, 2, 3, 4, 5, 0, 6, 0, 0, 7, 8注:0代表这个位置没有数字,数据长度不超过1024。
输出描述
按照层级正向和反向输出二叉树,注意输出行末没有空格
示例1
输入
1, 2, 3, 4, 5, 0, 6, 0, 0, 7, 8
输出
1
2 3
4 5 6
7 8

7 8
4 5 6
2 3
1

 

代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
class Node{
    int val;
    Node left;
    Node right;
    public Node(int val){
        this.val = val;
    }
}
public class A1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] str = sc.nextLine().split(",");
        int len = str.length;
        int[] data = new int[len];
        for(int i=0; i<len; i++){
            data[i] = Integer.valueOf(str[i]);
        }
        Node root = creat(data);
        List<List<Integer>> result = levelorder(root);
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
        System.out.println();
        for (int i = result.size()-1; i >= 0; i--) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
    public static Node creat(int[] objs){
        ArrayList<Node> datas =new ArrayList<Node>();
        //        将一个数组的值依次转换为Node节点
        for(int o:objs){
            datas.add(new Node(o));
        }
        //第一个数为根节点
        Node root=datas.get(0);
        //建立二叉树
        for (int i = 0; i <objs.length/2; i++) {
            //左孩子
            if(datas.get(i*2+1).val!=0){
                datas.get(i).left=datas.get(i*2+1);
            }
            //右孩子
            if((i*2+2)<datas.size() && datas.get(i*2+2).val!=0){//避免偶数的时候 下标越界
                datas.get(i).right=datas.get(i*2+2);
            }
        }
        return root;
    }
    
    public static List<List<Integer>> levelorder(Node Node) {
        Queue<Node> queue = new LinkedList<>();
        List<List<Integer>> result = new ArrayList<>();
     if(Node == null) return result; queue.offer(Node);
// 首先将根节点root入队 while (!queue.isEmpty()) {// Queue不为空则循环 List<Integer> node = new ArrayList<>();// 保存每一层节点的值 int length = queue.size();// 每一层的节点数目 while (length > 0) { Node tree = queue.poll(); if (tree.left != null) { queue.offer(tree.left); } if (tree.right != null) { queue.offer(tree.right); } node.add(tree.val); length--; } // 循环结束后,得到的Queue为下一层做准备,node为本层遍历结果 result.add(node); } return result; } }

 

posted @ 2019-08-23 21:22  海米傻傻  阅读(314)  评论(0编辑  收藏  举报