如何在Dart中打印二叉树图?



我有一个这样的二叉树节点:

class BinaryTreeNode<T> {
BinaryTreeNode(this.value, {this.leftChild, this.rightChild});
T value;
BinaryTreeNode? leftChild;
BinaryTreeNode? rightChild;
}

我想添加一个toString方法,这样我就可以直观地表示二叉树的内容。

这是这个Java问题的Dart版本。我可以在那里移植一个答案,所以我把它添加到下面。

以下是这个答案的修改版本:

class BinaryTreeNode<T> {
BinaryTreeNode(this.value, {this.leftChild, this.rightChild});
T value;
BinaryTreeNode<T>? leftChild;
BinaryTreeNode<T>? rightChild;
@override
String toString() {
final out = StringBuffer();
rightChild?._buildTree(out, true, '');
out.writeln(value);
leftChild?._buildTree(out, false, '');
return out.toString();
}
void _buildTree(StringBuffer out, bool isRight, String indent) {
rightChild?._buildTree(out, true, indent + (isRight ? '     ' : '│    '));
out
..write(indent)
..write(isRight ? '┌─── ' : '└─── ')
..writeln(value);
leftChild?._buildTree(out, false, indent + (isRight ? '│    ' : '     '));
}
}

如果你创建一个这样的树:

void main() {
final tree = BinaryTreeNode('D',
leftChild: BinaryTreeNode('A'),
rightChild: BinaryTreeNode(
'R',
leftChild: BinaryTreeNode('T'),
rightChild: BinaryTreeNode('Fun'),
));
print(tree);
}

输出如下所示:

┌─── Fun
┌─── R
│    └─── T
D
└─── A

请随意修改我的答案以简化代码。我觉得toString方法可以简化为不重复这么多代码。

lrn的建议解决方案

下面的解决方案更有效,因为我们在遍历树结构时避免了创建中间字符串对象。感谢lrn建议这个方法:

class BinaryTreeNode<T> {
BinaryTreeNode(this.value, {this.leftChild, this.rightChild});
T value;
BinaryTreeNode<T>? leftChild;
BinaryTreeNode<T>? rightChild;
@override
String toString() {
final out = StringBuffer();
final indents = <String>[];
rightChild?._buildTree(out, true, indents);
out.writeln(value);
leftChild?._buildTree(out, false, indents);
return out.toString();
}
void _buildTree(StringBuffer out, bool isRight, List<String> indents) {
if (rightChild != null) {
indents.add(isRight ? '     ' : '│    ');
rightChild!._buildTree(out, true, indents);
indents.removeLast();
}
out
..writeAll(indents)
..write(isRight ? '┌─── ' : '└─── ')
..writeln(value);
if (leftChild != null) {
indents.add(isRight ? '│    ' : '     ');
leftChild!._buildTree(out, false, indents);
indents.removeLast();
}
}
}

相关内容

  • 没有找到相关文章

最新更新