当前位置: 首页 > 知识库问答 >
问题:

二叉树从只提供后序遍历到有序遍历

微生信鸿
2023-03-14

我在编码挑战中遇到了一个问题。

完整二叉树是一种二叉树,其中除叶节点外的每个节点都有两个子节点,且树的最后一级边高度h2^h叶节点。

您的任务很简单,给定完整二叉树的后序遍历,请按顺序遍历打印其

二叉树中的元素为字符类型,即每个节点存储一个字符值。

输入/输出格式

输入格式:

只有一个字符串输入表示后序遍历。

限制条件:

1.

输出格式

输出一个表示二叉树按顺序遍历的字符串

样品

样本输入0:

BCA

示例输出0:

美国银行


共有2个答案

萧懿轩
2023-03-14

您可以使用递归动态地执行此操作。

  • 将树分成3部分:左边右边root
  • 按顺序重新连接它们:左边root右边
  • 递归拆分,直到子树的长度为1。

波斯托诺德。JAVA

public class PostToInOrder {
    public static String convert(String post) {
        checkPerfect(post); // check whether tree is perfect,

        return convertInner(post);
    }

    private static String convertInner(String post) {
        int len = post.length();
        if (len == 1) return post; // base case,

        String left = post.substring(0, len >> 1); // left of post,
        String right = post.substring(len >> 1, len - 1); // right of post,
        char root = post.charAt(len - 1); // root of post,

        return convertInner(left) + root + convertInner(right);
    }

    private static void checkPerfect(String tree) {
        if (!isPerfect(tree)) throw new IllegalArgumentException("input is not perfect tree, size: " + tree.length());
    }

    private static boolean isPerfect(String tree) {
        int len = tree.length();
        if (len < 1) return false;

        while (len != 0) {
            if ((len & 1) == 0) return false;
            len >>= 1;
        }

        return true;
    }
}

波斯托诺德测试。java:
(单元测试,通过TestNG

import org.testng.Assert;
import org.testng.annotations.Test;

public class PostToInOrderTest {
    @Test
    public void test() {
        Assert.assertEquals(PostToInOrder.convert("BCA"), "BAC");
        Assert.assertEquals(PostToInOrder.convert("02146538A9CEDB7"), "0123456789ABCDE");

        Assert.assertEquals(PostToInOrder.convert("A"), "A"); // single element,
    }

    @Test(expectedExceptions = IllegalArgumentException.class)
    public void test_invalid_empty() {
        PostToInOrder.convert("");
    }

    @Test(expectedExceptions = IllegalArgumentException.class)
    public void test_invalid_notPerfect() {
        PostToInOrder.convert("AB");
    }
}

顺便说一句:

  • 所述的树是一个完美二叉树<它是完全二叉树的一个子类型<一棵完整的树不一定是完美的,它的最后一层可能缺少一些叶子
    例如AB是一棵完整的树,但不是完美的树
庄星汉
2023-03-14

我确实准备好了一个完整的答案,但是@EricWang在实现上击败了我。下面是一个补充答案,更详细地描述了这个过程。请接受他的回答。

我将使用后序遍历<代码> DEFFGCA,因为考虑稍微多的节点是有用的。

因为树是完整的,对于任何给定的节点,我们都知道左边的子节点数与右边的子节点数相同。因此,我们可以查看后序遍历DEBFGCA,知道它具有结构lllrrn,其中L是左子树的后序遍历,R是右子树的后序遍历,N是节点本身。

更一般地,我们知道左边子树的后序遍历是字符0(tree.length-1)/2-1,右边子树的后序遍历是字符(tree.length-1)/2-1tree.length-2。节点是最后一个字符,位于tree.length-1

显然,要将其更改为顺序遍历,我们只需识别左、右子树,将其更改为顺序遍历,然后返回LLLNRRR。我们可以使用递归将左右子树按顺序转换为。

例如,从DEBFGCA开始。我们知道结构是lllrrn,因此左子树是DEB,右子树是FGC,节点是A。我们要将DEB转换为以便。。。

处理DEB。我们知道左边的子树是D,右边是E,节点是B。两个子树的长度都是1,叶子也是。不需要进一步的递归。返回LNR,即DBE

过程FGC。与前面一样,返回FCG

现在我们知道按顺序排列的左边是DBE,右边是FCG。返回LLLNRRR,即DBEAFCG

 类似资料:
  • 二叉树遍历崩溃求大神帮我分析分析 以下是我同学的代码可以跑 实在是看不出哪里有什么不同

  • 为了上课,我必须创建一个状态对象的二叉树,每个状态对象包括一个居民对象的二叉树,这些居民对象组织住在每个州的人。我试图在一个给定的州中搜索最老的居民;然而,居民是按字母顺序组织在树中的,这对我的搜索毫无帮助。因此,我必须遍历整个居民树,更新保存最老的人的节点,并在树被完全遍历后返回它。我已经有了代码的第一部分,但是还停留在如何写递归的剩余部分。 状态树的方法: 然后是公共“包装器”状态树方法:

  • 中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤1000),代表给出的二叉树的结点总数(当然,其中可能包含虚结点)。结点编号均为正整数,且各不相同。 然后输入n个正整数,表示按完全二叉树(即第1层1

  • 我想仅使用一个堆栈对二叉树进行后序遍历。这是我的代码,首先我将左侧元素推入堆栈,直到达到null。然后我弹出一个元素并检查弹出的元素和当前堆栈顶部的右侧元素是否相同。但不知何故,这将进入无限循环。你能告诉我为什么吗??

  • 我是在一次采访中被问到这个问题的。 问题:给出了一个二叉树和相应子树的高度。然后我们必须按顺序找到一个特定位置的元素。 例如:树结构为:D(根节点)[subtree-size=6]-->B,F(D的子节点)[subtree-size=2]-->A,C,E,G(叶节点)[subtree-size=0]。 因此共有3个级别:级别0:D;1级:B级、F级;2级:A、C、E、G 我们必须在inorder中

  • 本文向大家介绍C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法,包括了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。