【问题标题】:Find position of nodes in binary tree在二叉树中查找节点的位置
【发布时间】:2016-03-19 12:35:22
【问题描述】:

我正在尝试找到以下问题的有效解决方案。给定的输入是:二叉树中的节点数、根、边和一些节点的列表,如果它是在网格中绘制的,则在树中找到它们的坐标,例如 边上的边或节点没有按任何特定顺序给出,但将节点连接到左子节点的边出现在输入的前面。树可以有超过百万个节点并使用

构建树
class Node {
public Node left;
public Node right;
public int key;...}

太慢了。但是我找不到如何以可以找到节点坐标的方式表示树。 输入示例:

4 0 // 4 is number of nodes, 0 is root

0 1 // edge
0 3 // edge
2 3 // edge

我应该找到节点的坐标,例如3 输出为:3 1

【问题讨论】:

  • 所有节点都应该有唯一的 X 坐标吗?
  • @radoh 是的,唯一的 x 坐标
  • 这是来自一些编程挑战类型网站的任务吗?你能发个链接吗? :)
  • 不,这是我的作业
  • 这有点微不足道,不是吗?对 x 坐标使用有序编号,对 y 坐标使用(树高 - 节点深度)。

标签: java algorithm tree binary-tree


【解决方案1】:

您需要构建整个树,因为您需要知道树的结构才能确定 X 坐标。
但是,如果您的算法是线性,那么即使有数百万个节点也应该不是问题。

算法看起来很简单。

首先我们需要构建树形结构。在构建树以快速访问特定的Node 时,我会使用Map<Integer, Node>(该地图稍后也会很有用)。(如果Node id 是范围内的整数,甚至Node[] 也可以正常工作0..NodeCount-1)
Node 类应该有一个方便的方法addNode(Node node),它首先添加left 节点,然后添加right 节点。它可能看起来像这样:

void addNode(Node node) {
  if (left == null)
      left = node;
  else
      right = node;
}

关于addEdge(int from, int to) 方法,这样的东西应该可以工作

void addEdge(int from, int to) {
    Node fromNode = nodes.get(from); // this should never be null, root should be added manually first
    Node toNode = nodes.get(to);
    if (toNode == null) {
        toNode = new Node(to); // 'content' constructor
        nodes.put(to, toNode);
    }
    fromNode.addNode(toNode);
}

然后,我们需要将 X 坐标分配给节点。我会使用递归函数,如下所示:

int assignXY(Node node, int lastX, int y) {
    node.y = y;
    node.x = 1 + (node.left == null ? lastX: assignX(node.left, lastX, y - 1));
    return (node.right == null ? node.x : assignX(node.right, node.x, y - 1);
}

然后这样称呼它

assignXY(rootNode, -1, maxDepth);

现在,所有节点都有 X 坐标,所以你可以简单地从我们之前定义的 Map 中拉出你感兴趣的 Node 并返回它的 x

【讨论】:

  • 澄清一下,考虑到问题中定义的坐标,每个节点归结为x = #nodes to the lefty = depth of the tree - own depth
  • @WorldSEnder 是的。嗯,我的y 坐标颠倒了,但扭转它应该不是什么大问题。基本上,只需找到树中的最大深度,然后用该数字调用assignXY(),并在每次迭代中减少assignXY() 内的y
  • @radoh 你能建议如何使 addNode(Node node) 快速吗?我正在尝试通过输入边构建树并选择左右节点,然后使用子节点递归地执行它,但它太慢了
  • @user2950602 addNode() 本身应该不是问题。我已经用有关树构造的更多详细信息更新了我的答案。我不明白你在树构造过程中使用递归做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多