网易:层次遍历二叉树

Posted haimishasha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网易:层次遍历二叉树相关的知识,希望对你有一定的参考价值。

题目描述

分层遍历二叉树
用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<>();
        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;
    

 

以上是关于网易:层次遍历二叉树的主要内容,如果未能解决你的问题,请参考以下文章

聊聊算法 • 二叉树遍历(前序中序后序层次)

二叉树的层次遍历 II

重建二叉树与二叉树的层次遍历

求二叉树的层次遍历

PTA 二叉树的层次遍历

七十七 二叉树的层次遍历和最大深度