网易:层次遍历二叉树

题目描述

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

原文地址:https://www.cnblogs.com/haimishasha/p/11370583.html

时间: 2024-11-05 22:05:51

网易:层次遍历二叉树的相关文章

层次遍历二叉树

层次遍历二叉树,编程之美上看过解法,然后在练习了一下.用递归和vector,队列实现了,然后加上了测试函数,测试函数的二叉树创建方法待改进. //有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树. //给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列.保证结点数小于等于500. #include <iostream> using namespace std; #include <vecto

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

C++层次遍历二叉树

#include <iostream> #define maxSize 5 using namespace std; typedef struct BTNode { char data; struct BTNode * lchild; struct BTNode * rchild; }BTNode; BTNode * initBTNode() { BTNode *node = (BTNode*)malloc(sizeof(BTNode)); node->lchild=0; node-&g

按层次遍历二叉树

void traverse(bitree bt) {  linkqueue q;  bitree p;  initqueue(q);      //初始化一个空的队列 p=bt; enqueue(q,p);      //入队  while(queueempty(q)!=1)  {   dequeue(q,p);      //出队    if(p->lchild!=NULL) enqueue(q,p->lchild);             //访问左子树  if(p->rchild

数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2 abdegcf dbgeaf

&lt;二叉树的基本操作(有层次遍历)&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define FALSE 0 #define TRUE 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struc

二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作

#include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BiTNode,*BiTree; typedef struct { BiTree element[MAXSIZE]; int front; int rear; }SeqQueue; /*初始化队列*/ void Ini

【数据结构】二叉树层次遍历

package 蓝桥练习; public class 二叉树层次遍历 { public static int MAXSIZE = 100; public static Node queue[] = new Node[MAXSIZE]; public static void main(String[] args) { Node h = new Node('H', null, null); Node i = new Node('I', null, null); Node f = new Node('

二叉树的层次遍历和(叶子)节点

#include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 #define resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct { //定义队列 Bitree *base; int front; int r