我正在学习并坚持解决这个问题:
我想创建一棵树,其中包含一个具有以下模式的字符串:
1[2[3,5],4[7[6,9,11],8]]
其中,2和4是1的子项;3和5是2的子项;7和8是4的子项;6、9和11是7的子项;依此类推。
然后打印一个简单的树结构图,如下所示:
1
/ \
2 4
/ \ / \
3 5 7 8
/ | \
6 9 11
任何帮助都是最好的。
发布于 2018-08-19 03:52:33
很好的练习。我提出这个答案并不是最好的方法,而是一种可以改进的天真的方法。
首先,需要将字符串解析为树结构。递归是一个显而易见的选择。前面有很多清理和错误处理的机会,包括使用堆栈跟踪括号对索引。
其次,我认为在给定解析的树结构的情况下,您正在寻找的输出是一个很高的要求。如果一个节点有60个子节点,会发生什么?考虑到确定所有东西的间距和进行高度/宽度计算,我让它变得简单,并尝试了一些类似于tree
的东西,它可以在几行代码中完成,并自动处理许多边缘情况。即使在这里,为长根节点添加填充也可能是一个改进的点。
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)));
输出:
1 ────┐
2 ────┐
3
5
4 ────┐
7 ────┐
6
9
11
8
https://stackoverflow.com/questions/51909782
复制相似问题