2017校招 美团笔试题 编程题 层次遍历多叉树

来源:互联网 发布:检测图片中的文字算法 编辑:程序博客网 时间:2024/06/15 20:26

题目:美团笔试题 编程题  层次遍历多叉树

给定一棵多叉树,每个节点保存一个int类型数字且节点数字不重复,
要求从上到下按层次打印每个节点的数字,每个层次按从左到右的顺序。 
要求: 
(1)实现 一颗多叉树 
(2)根据自定义输入 ,构造多叉树 
(3)从左到右按层输出多叉树 
输入包含多行,每行有空格隔开的多个数字,第一个数字为某一个父节点的值,
后面N个数字为父节点的所有子节点的值,按从左到右的顺序排序,所有节点的值为整数,取值范围[0,100]。 
如: 
5 2 3 
2 6 7 8 
(5为根节点,有两个子节点;2为5的第一个子节点,包含三个子节点) 
输出包含一行,用空格隔开: 
5 2 3 6 7 8



注意:在本地测试用Scanner的时候,要先给出每个案例有多少行数据,
在下面的测试代码中打开注释的即可,输入格式为:
2
5 2 3
2 6 7 8


Java代码实现

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;/** * 多叉树的创建与遍历 *  * @author fangzheng * @date 2016年9月11日 下午4:19:58 */public class MultiTree {// 测试代码public static void main(String[] args) {/*Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {MultiNode root = null;boolean isFirst = true;//注意:此处加了一个输入参数:一个case有多少行int n = Integer.valueOf(scanner.nextLine());for (int j = 0; j < n; j++) {String input = scanner.nextLine();String[] arr = input.split(" ");int[] items = new int[arr.length];for (int i = 0; i < arr.length; i++) {items[i] = Integer.valueOf(arr[i]);}if (isFirst) {root = new MultiNode(items[0], null);isFirst = false;}construcMultiTree(root, items);}layerTran(root);}scanner.close();*/    //上面注释的是从命令行输入所得数据,下面是直接测试  MultiNode root = new MultiNode(5, null);  construcMultiTree(root, new int[] { 5, 2, 3 });   construcMultiTree(root, new int[] { 2, 6, 7, 8});  layerTran(root);}/** * 层次遍历多叉树 *  * @param root */public static void layerTran(MultiNode root) {if (root == null) {return;}Queue<MultiNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {MultiNode node = queue.poll();System.out.print(node.val + " ");if (node.nodeList != null) {for (MultiNode temp : node.nodeList) {queue.add(temp);}}}}/** * 构造多叉树 *  * @param root * @param arr */public static void construcMultiTree(MultiNode root, int[] arr) {// arr[0] 是子结点,后面是其孩子结点LinkedList<MultiNode> childList = new LinkedList<>();for (int i = 1; i < arr.length; i++) {MultiNode childNode = new MultiNode(arr[i], null);childList.add(childNode);}// 遍历root,找到结点nodefindNode(arr[0], root).nodeList = childList;}/** * 找到值为 val 的节点 *  * @param val * @param root * @return */public static MultiNode findNode(int val, MultiNode root) {if (val == root.val) {return root;}// System.out.println("root"+root);MultiNode temp = root;MultiNode resMultiNode = null;if (root.nodeList != null) {for (MultiNode tempNode : root.nodeList) {resMultiNode = findNode(val, tempNode);if (resMultiNode != null) {break;}}}return resMultiNode;}}/** * 多叉树的节点类 *  */class MultiNode {int val;LinkedList<MultiNode> nodeList;public MultiNode(int val, LinkedList<MultiNode> nodeList) {this.val = val;this.nodeList = nodeList;}@Overridepublic String toString() {return "MultiNode [val=" + val + ", nodeList=" + nodeList + "]";}}



1 0
原创粉丝点击