首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从嵌套的列表字符串中漂亮地打印树形图

从嵌套的列表字符串中漂亮地打印树形图
EN

Stack Overflow用户
提问于 2018-08-18 22:43:44
回答 1查看 104关注 0票数 1

我正在学习并坚持解决这个问题:

我想创建一棵树,其中包含一个具有以下模式的字符串:

代码语言:javascript
复制
1[2[3,5],4[7[6,9,11],8]]

其中,2和4是1的子项;3和5是2的子项;7和8是4的子项;6、9和11是7的子项;依此类推。

然后打印一个简单的树结构图,如下所示:

代码语言:javascript
复制
            1
         /    \
        2      4
       / \    /  \
      3   5  7   8
           / | \
          6  9  11

任何帮助都是最好的。

EN

回答 1

Stack Overflow用户

发布于 2018-08-19 03:52:33

很好的练习。我提出这个答案并不是最好的方法,而是一种可以改进的天真的方法。

首先,需要将字符串解析为树结构。递归是一个显而易见的选择。前面有很多清理和错误处理的机会,包括使用堆栈跟踪括号对索引。

其次,我认为在给定解析的树结构的情况下,您正在寻找的输出是一个很高的要求。如果一个节点有60个子节点,会发生什么?考虑到确定所有东西的间距和进行高度/宽度计算,我让它变得简单,并尝试了一些类似于tree的东西,它可以在几行代码中完成,并自动处理许多边缘情况。即使在这里,为长根节点添加填充也可能是一个改进的点。

代码语言:javascript
复制
function parse($data) {
    $result = [];
    $d = "";
    
    for ($i = 0; $i < count($data); $i++) {
        if (preg_match("/^[^\[\]\,]$/", $data[$i])) {
            $d = "";
            
            while ($i < count($data) && 
                   preg_match("/^[^\[\]\,]$/", $data[$i])) {
                $d .= $data[$i++];
            }
            
            $i--;
            $result[$d] = null;
        }
        else if (preg_match("/^[\[\]]$/", $data[$i])) {
            $closing_idx = -1;
            $level = 1;
            $j = $i + 1;
            
            for (; $j < count($data); $j++) {
                if ($data[$j] === "[") {
                    $level++;
                }
                else if ($data[$j] === "]") {
                    if (--$level === 0) {
                        $closing_idx = $j;
                        break;
                    }
                }
            }
            
            $cpy = [];
            
            for ($k = $i + 1; $k < $closing_idx; $k++) {
                $cpy[] = $data[$k];
            }
            
            $result[$d] = parse($cpy);
            $i = $closing_idx;
        }
    }
    
    return $result;
}

function print_tree($tree, $depth=0) {
    if ($tree) {
        foreach ($tree as $root => $child) {
            echo str_repeat(" ", $depth * 6);
            echo "$root " . ($child ? "────┐" : "") . "\n";
            print_tree($child, $depth + 1);
        }
    }
}
 
$data = "1[2[3,5],4[7[6,9,11],8]]";
print_tree(parse(str_split($data)));

输出:

代码语言:javascript
复制
1 ────┐
      2 ────┐
            3 
            5 
      4 ────┐
            7 ────┐
                  6 
                  9 
                  11 
            8 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51909782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档