Algorithm 二叉树x轴上的最大投影

Algorithm 二叉树x轴上的最大投影,algorithm,data-structures,language-agnostic,binary-tree,Algorithm,Data Structures,Language Agnostic,Binary Tree,给定坐标平面上的二叉树,其根具有坐标(x,y)。我们需要找到这棵树在x轴上的最大投影。也就是说,基本上我们需要找到这棵树的最大宽度。这棵树也可能是歪斜的 示例: 1 / \ 2 3 / / \ 4 5 6 Width=5 1 / \ 2 3 / 4 Width=4 1 / 2 / 4 Width=3 我的逻辑是找到最左边的节点和最右边的节点,然后减去它们的x坐标。从根到左子树x变为x

给定坐标平面上的二叉树,其根具有坐标(x,y)。我们需要找到这棵树在x轴上的最大投影。也就是说,基本上我们需要找到这棵树的最大宽度。这棵树也可能是歪斜的

示例:

    1
   / \
  2   3
 /   / \
4   5   6
Width=5

    1
   / \
  2   3
 /  
4   
Width=4

    1
   / 
  2  
 /   
4   
Width=3

我的逻辑是找到最左边的节点和最右边的节点,然后减去它们的x坐标。从根到左子树
x
变为
x-1
,y变为
y+1
,从右子树
x
变为
x+1
。在找到这两个坐标xLeft和xRight后,我们可以找到最大宽度。但是我在编码它时遇到了麻烦


谁能告诉我怎么做?这不是一个家庭作业问题,而是我在某处读到的一个编程难题。

这是一个水平顺序遍历问题。在按级别顺序遍历树时,跟踪最大级别的宽度。完成后,该级别的最左侧节点和最右侧节点将为您提供要查找的最终投影

编辑:

姆贝基什:上述解决方案假设问题是关于最大横截面的。但如果不是这样的话,级别顺序仍然有效。除此之外,代码必须在遍历期间跟踪
minX
maxX
minX
将跟踪最左边的节点,
maxX
将跟踪最右边的节点。那么答案将是
maxX-minX+1


有许多可以修改的文档化bst遍历代码。

您可以通过执行标准树遍历算法来解决此问题,同时保持当前节点的x坐标。无论何时向左,你都会减小x,无论何时向右,你都会减小x。如下所示:

void ExtremalNodes(Node* curr, int x, int& maxX, int& minX) {
    if (curr == nullptr) return;
    maxX = std::max(x, maxX);
    minX = std::min(x, minY);
    ExtremalNodes(curr->left, x - 1, maxX, minX);
    ExtremalNodes(curr->right, x + 1, maxX, minX);
}
int TreeProjection(Node* root) {
    if (root == nullptr) return 0;

    int maxX = 0;
    int minX = 0;
    ExtremalNodes(root, 0, maxX, minX);
    return maxX - minX + 1;
}

希望这有帮助

对于Op的第一个示例,您的解决方案给出的宽度是5还是3?@mbeckish很好。我编辑。事实上,这是一个公平的秩序。除了我最初的回答是最大横截面。我想你在编辑之前就知道了。OP的问题是,它缺少坐标实际是什么的细节。我会询问细节。@mbeckish这个OP确实有点混乱,因为它缺少细节。你是怎么理解的?@kasavbere我理解为将节点放置在离散的列和行中(如位图的像素或文本行和列),并将节点排列成一个漂亮的金字塔状结构(每个节点都位于其子树的中心)。然后问题是确定保存整个树所需的列数。@mbeckish的可能重复-我认为这个问题根本不是重复的。链接的问题是关于如何在树中布置节点。这是一个关于发现树的结构属性的问题。@templatetypedef-这两个问题都是关于确定树的特定图形表示的宽度,对吗?如果这不是这个问题的内容,那么你对“最大宽度”的定义是什么?我认为@kasavbere在进行额外编辑之前就知道了。但是您需要告诉我们,您是如何计算宽度=5的?你是说4的x坐标是
0
,6的x坐标是
5
?因为实际上宽度应该是4,因为
2--2=4
。请提供更多详细信息。您如何知道每个节点的x坐标?从对ExtremalNodes的递归调用来看,您似乎假设左侧子节点始终位于其父节点左侧一个单位,而右侧子节点始终位于父节点右侧一个单位。一般情况并非如此。例如,在一个完整的二叉树中,根的左、右子树将分布得相当广泛,以便为它们的宽子树腾出空间。@mbeckish-OP明确提到,左或右子树将改变x的+/-1,这就是这个答案的来源。我同意这在实践中是行不通的,但我认为这更多的是一个理论问题。