【问题标题】:How to find x coordinate in a tree?如何在树中找到 x 坐标?
【发布时间】:2022-01-05 11:46:55
【问题描述】:

所以我有一个程序,需要以坐标 x 和 y 的形式获取节点的位置,具体取决于它在树中的位置,这意味着 x 坐标 0 属于整个树中最左边的节点.例如像这样的树:

    5
      \
        2
       /
      1
     /   
    4
   / 
  3 

坐标应该是:

node x y
5 0 0
2 4 1
1 3 2
4 2 3
3 1 4

当我的代码得到我时:

node x y
5 0 0
2 3 1
1 2 2
4 1 3
3 0 4

我的代码:

static class Node {
        
        Integer value;
        Node leftNode;
        Node rightNode;
        Integer x;
        Integer y;

        Node ( Integer value, Node left, Node right) {
 
            this.value = value;
            leftNode = left;
            rightNode = right;
            this.x = 0;
            this.y = 0;

        }
}

public static void setCoordinates (Node node, int level, int upperX){
            if (node == null) {
                return;
            }
            else {
                node.y = level;
                node.x = xCordinate(node.leftNode, upperX) ;
                
                System.out.println("x :: " + node.x + " y ::  " + node.y + "  node   ::" + node.value);

                setCoordinates(node.leftNode, level + 1, 0);
                setCoordinates(node.rightNode, level +1 , node.x);
            }
        }
public static void setCoordinates (Node root) {
   // root is a variable defined in main w
            Node n = root;
            int lvl = 0;
            setCoordinates(n, lvl, 0); 
        }

public static int xCordinate (Node n , Integer upperX) {
            if (n == null){
                return 0;
            }
            else {
                int nrOfLeft =  xCordinate(n.leftNode,0);
                int nrOfRight = xCordinate(n.rightNode,0);
                return nrOfLeft + nrOfRight + 1 + upperX;
            }
        }


有人可以帮我获得正确的 x 坐标吗? y 坐标没有给我带来任何麻烦。 谢谢你的帮助!!

【问题讨论】:

  • 你能解释一下5的坐标是(0,0)吗? x 坐标 0 属于整个树中最左边的节点 - 5 不是整个树中最左边的节点。
  • 是的,因为节点 5 没有任何左儿子,所有其他音符都是该节点的右后代,它应该是最左边的元素

标签: java algorithm data-structures tree


【解决方案1】:
public static int setCoordinates (Node node, int level, int nextX){
            if (node == null) {
                return;
            }
            else {
                nextX = setCoordinates(node.leftNode, level + 1, nextX);
                node.y = level;
                node.x = nextX;
                
                System.out.println("x :: " + node.x + " y ::  " + node.y + "  node   ::" + node.value);


                nextX = setCoordinates(node.rightNode, level +1 , node.x + 1);
                return nextX;
            }
        }

您需要跟踪左侧有多少个节点。可能有一些来自祖先的另一个左分支。

但是,如果您进行中序遍历,您将以正确的顺序访问节点。

【讨论】:

    【解决方案2】:

    存在三个问题:

    • setCoordinates 的第一次调用中,您不应将0 作为最后一个参数传递,因为返回值至少应为upperX。改为:

      setCoordinates(node.leftNode, level + 1, upperX);
      
    • setCoordinates 的第二次调用中,您不应传递node.x,因为该值已被使用。您需要传递可归因的最小值值,即多了一个:

      setCoordinates(node.rightNode, level + 1, node.x + 1); // <--
      
    • xCordinate 中,您永远不应返回小于upperX 的值,因此当节点为null 时不要返回0,但是:

      if (n == null){
          return upperX;
      }
      

    通过这些更改,它将起作用。但是,这是低效的,因为您使用 xCordinate每个 节点执行子树遍历,因此这可能会多次访问同一个节点。您应该修改您的算法,以便它可以一次完成这项工作。为此,您需要按顺序遍历。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 2010-12-28
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多