栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

还原二叉树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

还原二叉树

一 问题描述

小杰克喜欢玩二叉树。他最喜欢的游戏是根据二叉树节点的大写随机进行构造。

为了记录他的树,他为每颗树都写了两个字符串:一个先序遍历(根,左子树,右子树)和一个中序遍历(左子树、根、右子树)。上图所示的树,先序遍历是 DBACEFG,中序遍历是 ABCDEFG。他认为这样一对字符串可以提供足够的信息,以便重建这颗树。

二 输入和输出 1 输入

输入包括两个字符串,表示二叉树的先序遍历和中序遍历。两个字符串都由唯一的大写字母组成。

2 输出

输出该树的后序遍历序列(左子树、右子树、根)。

3 输入样例

DBACEGF ABCDEFG

4 输出样例

ACBFGED

三 算法设计

本问题给出二叉树的先序和中序序列,要求输出后序序列。无须构建二叉树,只需在还原二叉树的同时,输出后序序列即可。根据先序序列找根,以中序序列划分左右子树。

四 实现
package tree;


import java.util.Scanner;


public class UVA536 {
    // 先序序列
    private static String preorder;
    // 中序序列
    private static String inorder;


    
    static void postorder(int l1, int l2, int n) {
        if (n <= 0) {
            return;
        }
        // 在中序序列中找到根的位置
        int len = inorder.indexOf(preorder.charAt(l1)) - l2;
        postorder(l1 + 1, l2, len);
        postorder(l1 + 1 + len, l2 + len + 1, n - len - 1);
        System.out.print(preorder.charAt(l1));
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        preorder = scanner.nextLine();
        inorder = scanner.nextLine();
        int len = preorder.length();
        postorder(0, 0, len);
    }
}
五 测试

绿色表示输入,白色表示输出

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/970227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号