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

时间:2013-01-18 14:50:38

标签: algorithm data-structures language-agnostic binary-tree

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

示例:

    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后,我们可以找到最大宽度。但我在编码时遇到了麻烦。

任何人都可以告诉你如何去做吗?这不是一个家庭作业问题,但这是我在某处读到的一个编程难题。

2 个答案:

答案 0 :(得分:1)

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

编辑:

mbeckish:上述解决方案假设问题是关于最大的横截面。但如果情况并非如此,级别订单仍然有效。除了代码必须在遍历期间跟踪minXmaxXminX将跟踪最左边的节点,maxX将跟踪最右边的节点。然后答案是maxX-minX+1

This site有许多记录良好的bst遍历代码,你可以修改。

答案 1 :(得分:0)

您可以通过执行标准树遍历算法来解决此问题,同时保持当前节点的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;
}

希望这有帮助!