【问题标题】:loading binary tree from string (parent-left-right)从字符串加载二叉树(父左右)
【发布时间】:2012-07-21 22:19:30
【问题描述】:

我有一棵看起来像这样的二叉树

代表它的对象看起来像这样(java)

 public class node {
   private String value = "";
   private TreeNode aChild;
   private TreeNode bChild;
 ....
 }

我想读取数据并从字符串构建树。
所以我写了一些小方法来序列化它,我有这样的
(父母左右)
0,null,O@1,left,A@2,left,C@3,left,D@4,left,E@4,right,F@1,right,B@

然后我阅读它并将它作为一个列表 - 对象按 O、A、C、D、E、F、B 的顺序排列

现在我的问题是 - 如何构建树?
迭代并将其放入堆栈、队列?
我应该以不同的顺序序列化吗?

(基本上我想学习从字符串数据构建树的最佳实践)
你能给我推荐一个关于那个主题的链接吗?

【问题讨论】:

    标签: java tree


    【解决方案1】:

    鉴于您的第二个字符串表示,没有办法检索原始树。因此,除非具有该序列的 any 树是可接受的,否则您必须在字符串中包含 mor 信息。一种可能的方法是以某种方式表示null 引用。另一个是使用括号或类似的。

    鉴于您的第一个表示,恢复数据仍然是可能的。一种利用级别信息的算法如下:

    • 保持对树中当前位置的引用 x
    • 对于您要添加的每个节点 n,只要 x 的级别为 no,请将该引用 x 在树中向上移动小于n的级别
    • 检查现在 x 的级别是否正好比 n 的级别低一
    • 使 x 成为 n 的父级,n 成为 x 的下一个子级
    • 移动 x 到现在指向 n

    如果您的节点中有 父链接,则此方法有效。如果不这样做,那么您可以维护每个级别的最新节点列表。 x 将对应于该列表的最后一个元素,并且将 x 向上移动意味着从列表中删除最后一个元素。 x 的级别将是列表的长度。

    【讨论】:

      【解决方案2】:

      您的序列化没有得到很好的解释,特别是关于您如何表示缺失的节点。有几种方法,例如用 () 表示树结构或使用数组技术中的二叉树。这两个都可以很容易地序列化。请查看Efficient Array Storage for Binary Tree 以获得更多解释。

      【讨论】:

        猜你喜欢
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 1970-01-01
        • 2022-01-03
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多