Dart中的随机二叉树

Dart中的随机二叉树,dart,binary-tree,Dart,Binary Tree,我只需要在给定节点数的情况下生成随机二叉树。我想用一个带有类的链接树结构来实现它。可能吗?还是有别的办法?我找不到这方面的任何资源。我想一个类似java的示例也可以工作。有很多不同的方法可以做到这一点。这里有一个可能的方法。它创建节点,然后通过遍历每个节点并从具有开放点的节点中为其提供一个随机父节点来连接节点 import 'dart:math'; const maxNodes = 10; void main() { final rng = Random(); final nodes

我只需要在给定节点数的情况下生成随机二叉树。我想用一个带有类的链接树结构来实现它。可能吗?还是有别的办法?我找不到这方面的任何资源。我想一个类似java的示例也可以工作。

有很多不同的方法可以做到这一点。这里有一个可能的方法。它创建节点,然后通过遍历每个节点并从具有开放点的节点中为其提供一个随机父节点来连接节点

import 'dart:math';

const maxNodes = 10;

void main() {
  final rng = Random();
  final nodes = List.generate(maxNodes, (index) => Node(index + 1));
  final openNodes = [nodes[0]];
  nodes.skip(1).forEach((node) {
    node.parent = openNodes[rng.nextInt(openNodes.length)];
    openNodes.add(node);
    if (node.parent.right != null ||
        (node.parent.left == null && rng.nextBool())) {
      node.parent.left = node;
    } else
      node.parent.right = node;
    if (node.parent.left != null && node.parent.right != null)
      openNodes.remove(node.parent);
  });
  nodes.forEach(print);
}

class Node {
  Node(this.id);
  final int id;
  Node parent;
  Node left;
  Node right;
  @override
  String toString() => '$id: (${left?.id ?? '_'}, ${right?.id ?? '_'})';
}

在上测试。

谢谢您的方法。但既然next在每次迭代中只能是左或右(如果不是当前的话),这难道不意味着我们只走一条路吗?例如,如果我们选择从根部向左走,我想,树的右侧将不可能生长?我从来没有想过要从下至上建造这棵树。这似乎很有效。非常感谢,这是自上而下的。从根部开始,随机填充开放点。True。我的意思是“自下而上”,即首先随机分配父母,而不是分配孩子。我想这是一个错误的术语,你可以简单地生成N个随机数。然后你把它们插入树中。顺便说一句,这和省道有什么关系?树的形状应该是随机的。所以它不像生成N个随机数那么容易。由于我刚刚进入Dart,它可能有一些功能,可以帮助我在这种情况下,我还不知道。但Dart方面的经验丰富的人可能知道。如果您使用的树数据结构不是自平衡的(但即使是自平衡的),生成N个随机数并将其插入树中就足以生成具有随机形状的树。我不确定我是否理解。您如何保证树中的每个节点都将被连接?难道不可能存在断开连接的子树吗?