给定坐标平面中的二叉树,其根具有坐标(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后,我们可以找到最大宽度。但我在编码时遇到了麻烦。
任何人都可以告诉你如何去做吗?这不是一个家庭作业问题,但这是我在某处读到的一个编程难题。
答案 0 :(得分:1)
这是一个水平顺序遍历问题。在按级别顺序遍历树时,跟踪最大级别的宽度。完成后,该级别的最左侧节点和最右侧节点将为您提供您要查找的最终投影。
编辑:
mbeckish:上述解决方案假设问题是关于最大的横截面。但如果情况并非如此,级别订单仍然有效。除了代码必须在遍历期间跟踪minX
和maxX
。 minX
将跟踪最左边的节点,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;
}
希望这有帮助!