首页 > 编程语言 >java实现 已知一颗树的层序遍历和中序遍历 输出树的先序遍历和后序遍历

java实现 已知一颗树的层序遍历和中序遍历 输出树的先序遍历和后序遍历

时间:2024-10-14 22:34:41浏览次数:6  
标签:遍历 java int inOrder 中序 levelOrder ans root

给定树的节点数,在给出这棵树的层序遍历和中序遍历

输出这棵树的先序遍历和后序遍历

输入

7
3 5 4 2 6 7 1
2 5 3 6 4 7 1

输出

3 5 2 4 6 7 1
2 5 6 1 7 4 3
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

class Node {
    int data;
    Node left, right;
    public Node(){
        ;
    }
    public Node(int item) {
        data = item;

    }
}

class Tree {
    private HashMap<Integer, Integer> inorderMap;
    public Tree(int[] inOrder, int[] levelOrder){
        inorderMap = new HashMap<>();
        for (int i = 0; i < inOrder.length; i++) {
            inorderMap.put(inOrder[i], i);
        }
    }
    public Node build(int[] levelOrder, int[] inOrder, int inorderStart, int inorderEnd){
        if(inorderStart > inorderEnd){
            return null;
        }
        int rootIndex = 0;
        for(int i = 0; i < levelOrder.length; i++){
            if(inorderStart <= inorderMap.get(levelOrder[i]) && inorderMap.get(levelOrder[i]) <= inorderEnd){
                rootIndex = inorderMap.get(levelOrder[i]);
                break;
            }
        }
        Node root = new Node(inOrder[rootIndex]);

        if(rootIndex > inorderStart) {
            root.left = build(levelOrder,  inOrder, inorderStart, rootIndex - 1);
        }
        if(rootIndex < inorderEnd) {
            root.right = build(levelOrder, inOrder, rootIndex + 1, inorderEnd);
        }

        return root;
    }

    public void preOrder (Node root, List<Integer> pre_ans){
        if(root != null){
            pre_ans.add(root.data);
            preOrder(root.left, pre_ans);
            preOrder(root.right, pre_ans);
        }
    }

    public void postOrder (Node root, List<Integer> post_ans){
        if(root != null){
            postOrder(root.left, post_ans);
            postOrder(root.right, post_ans);
            post_ans.add(root.data);
        }
    }

}

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();

        int[] levelOrder = new int[n];
        for (int i = 0; i < n; i++) {
            levelOrder[i] = scanner.nextInt();
        }

        int[] inOrder = new int[n];
        for (int i = 0; i < n; i++) {
            inOrder[i] = scanner.nextInt();
        }

        scanner.close();

        Tree tree = new Tree(inOrder, levelOrder);
        Node root = tree.build(levelOrder, inOrder, 0, n - 1);

        List<Integer> pre_ans = new ArrayList<>();
        List<Integer> post_ans = new ArrayList<>();
        tree.preOrder(root, pre_ans);
        print(pre_ans);
        System.out.println();
        tree.postOrder(root, post_ans);
        print(post_ans);
    }

    public static void print(List<Integer> ans){
        boolean flag = true;
        for (int i = 0; i < ans.size(); i++) {
            if(!flag){
                System.out.print(" ");
            }
            System.out.print(ans.get(i));
            flag = false;
        }
    }
}

标签:遍历,java,int,inOrder,中序,levelOrder,ans,root
From: https://www.cnblogs.com/6Luffy6/p/18466347

相关文章

  • java数组讲解
    前言:由上两章,我们已经了解关于java的基础语法,这章我们将讲解数组的相关语法,坐好了没,我们准备要发车啦!!!我们将从五部分给大家讲解:1数组的基本概念2.数组是引用类型3.数组的应用场景4.数组的练习5.二维数组1数组的基本概念:1.1 为什么要使用数组1.存储多个相同类型的......
  • 【油猴脚本】00027 案例 Tampermonkey油猴脚本, 仅用于学习,不要乱搞。添加标题为网页数
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • java计算机毕业设计OA办公自动化系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展,企业办公模式正经历着深刻的变革。传统的纸质化、人工化的办公方式已难以满足现代企业高效、协同、信息化的管理需求。OA(Offi......
  • java计算机毕业设计城市天然气管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,天然气作为一种清洁、高效的能源,在城市能源供应中占据了越来越重要的地位。然而,传统的天然气管理方式存在诸多不足,如信息孤岛、......
  • 今日一学,5道Java基础面试题(附Java面试题及答案整理)
    前言马上国庆了,本来想着给自己放松一下,刷刷博客,慕然回首,自动拆装箱?equals?==?HashCode?instanceof?似乎有点模糊了,那就大概看一下5道Java基础面试题吧。好记性不如烂键盘~***12万字的java面试题整理***instanceof关键字的作用instanceof严格来说是Java中的一个双目运算符,用......
  • JavaScript 代码能够成功进行树摇(Tree Shaking),代码规范
    要确保JavaScript代码能够成功进行树摇(TreeShaking),你可以遵循以下几个实践:1.使用ES6模块树摇主要依赖于ES6的模块语法(import和export)。确保你的代码使用这种模块系统,而不是CommonJS的require和module.exports。//正确的ES6模块语法exportconstfoo=()......
  • Java二维数组
    Java中的二维数组是一个存储多个一维数组的数组。它可以被看作是一个表格或者矩阵。声明一个二维数组的方法如下:dataType[][]arrayName;其中,dataType是指定数组元素类型的数据类型,arrayName是数组的名称。初始化二维数组的方法有两种:指定数组的大小,并逐个赋值:dataType......
  • Javaweb之SpringBootWeb案例之 登录功能的详细解析
     1.登录功能1.1需求编辑在登录界面中,我们可以输入用户的用户名以及密码,然后点击"登录"按钮就要请求服务器,服务端判断用户输入的用户名或者密码是否正确。如果正确,则返回成功结果,前端跳转至系统首页面。1.2接口文档我们参照接口文档来开发登录功能基本信息请求路径:/login请......
  • java中,深克隆和浅克隆怎么用,有什么应用场景?-----面试题分享
    在Java中,对象的克隆可以分为浅克隆(ShallowClone)和深克隆(DeepClone)。这两种克隆方式的主要区别在于它们如何处理对象内部的引用类型字段。浅克隆(ShallowClone)定义:浅克隆创建一个新对象,然后将原始对象中的非静态字段复制到新对象中。如果字段是基本类型,则直接复制其值;如......
  • Java基础语法-变量,常量,作用域
    变量、常量、作用域变量是什么:就是可以变化的量。Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元。其要素包括变量名,变量类型和作用域。typevarName[=value][{,varName[=value]}];//数据类型 变量名=值;可以使用逗号隔开来声明多个同......