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

树遍历和序列化

茅慈
2023-03-14

我正试图弄清楚如何使用树遍历来唯一地识别一棵树,问题的关键似乎是这棵树是香草二叉树(BT),还是它也有更严格的规定二进制搜索树(BST)。这篇文章似乎表明,对于BT,单一的顺序、前序和后序遍历不会唯一地识别树(在这种情况下唯一地意味着键的结构和值)。以下是文章的快速摘要:

BTs
1。我们可以用前序-序和后序-序唯一地重构BT。
2。如果我们还规定遍历跟踪节点的空子节点,那么我们也可以使用前序后序。

(对我来说,一个悬而未决的问题是,如果BT可以包含非唯一元素,那么上述情况是否仍然成立)

BSTs
3.我们不能对唯一的id使用inorder。我们需要有序的预购,或有序的后订单。

现在,(最后)我的问题是,我们可以只使用预订单还是后订单来唯一标识BST?我认为我们可以,因为这个问题和答案似乎是肯定的,我们可以使用预排序,但任何输入都非常感谢。

共有2个答案

宇文育
2023-03-14

好的,您只能使用预排序来标识一棵树。这是可能的,因为只有在前序遍历中,当前节点的id才位于子节点的id之前。因此,您可以从根到叶读取遍历输出。

你可以查http://en.wikipedia.org/wiki/Tree_traversal#Pre-order确认

因此,您可以将前序遍历视为树中的插入列表。因为BST中的树插入是确定性的,所以当您将值列表插入空树时,您总是得到相同的树。

齐健柏
2023-03-14

我不知道这里有什么问题。任何二叉树,不管它是否有序,都可以通过写出重建树所需的操作序列来序列化。想象一下,一台简单的堆栈机器只有两条指令:

>

分配一个新的内部节点N,将一个值填充到N中,从堆栈中弹出最上面的两棵树,使它们成为N的左右子节点,最后将N推到堆栈上。

任何二叉树都可以序列化为此类机器的“程序”。序列化算法使用后序遍历。

 类似资料:
  • 我已经实现了一种方法来对一棵树(不是二叉树)进行预排序遍历。此树的每个父节点都有一个子节点数组,因此我使用的方法是: 将子节点链接到父节点“tnAA”的示例 但它只输出根节点,这种方法有什么问题? 解决方案:将children数组链接到每个parent:tnaa . setchildern(AA _ childern);

  • 如果我有前序和后序遍历,我可以构建一个不一定是二叉树的树吗?类似的东西: 预购: 后订单: 构建: 我已经读到,如果没有二叉树的顺序遍历,这是不可能的,但是对于非二叉树,有可能只使用前序和后序遍历吗?

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

  • 我仍然是Java的初学者。我刚刚学习了二分搜索法树和前序遍历的概念,以及如何使用递归来实现二叉树的前序遍历。大概是这样的: 但是,如何为 N 元树实现相同的递归模型呢?其中每个节点的子节点数不一定为 2?因为.left和.right将不适用,不是吗?如果需要提供更多代码,请lmk,谢谢。

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

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