Algorithm 二叉树的垂直和
如何找到二叉树的垂直和 比如说,, 考虑下面的二叉树,Algorithm 二叉树的垂直和,algorithm,data-structures,binary-tree,Algorithm,Data Structures,Binary Tree,如何找到二叉树的垂直和 比如说,, 考虑下面的二叉树, 1 / \ / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 7
1
/ \
/ \
/ \
2 3
/ \ / \
/ \ / \
4 5 6 7
/ \ / \ / \ / \
5 9 1 3 6 7 5 5
对于上述树木,垂直总和应按如下方式计算:
- 第1行:5
- 第2行:4
- 第3行:2,9,1
- 第4行:5
- 第5行:1,3,6
- 第6行:6
- 第7行:3,7,5
- 第8行:7
- 第9行:5
5,4,12,5,10,6,15,7,5
首先,您应该找到位置,您可以通过计算到达特定节点的向左和向右花费的数量来完成此操作:
1 : l = 0, r = 0
/ \
/ \
l=1,r=0 2 3 : l = 0, r = 1.
/ \ / \
... 4...5 6...7 ....
只需遍历二叉树,最后为每个节点计算LorR=NumberOfLeft-NumberOfRights
,然后将这些数字(按它们的LorR
值)分组,并找到每个组的总和(从LorR
的最大正值到最大负值打印它们)
更新:这不适用于高度超过两棵的树,我们只需对算法稍加修改即可解决此问题
我们可以将树视为金字塔,金字塔的每个顶点的长度为1,在每个分支的剩余部分等于最近移动中通过的部分后,我们在图中显示高度为3的树:
1
/ \
/ \
/ \
2 3 upto this we used 1/2 size of pyramid
/ \ / \
/ \ / \
4 5 6 7 upto this we used 1/2 + 1/4 part of pyramid
/ \ / \ / \ / \
5 9 1 3 6 7 5 5 upto this we used 1/2 + 1/4 + 1/4 part of pyramid
这意味着在每一步中,我们都会根据左值的高度计算左值(事实上,每次乘以1/2都会加到左值上,除了上次,它等于h-1 st值)
对于这种情况,我们有:根中的1在组0中,叶中的3在组-1/2+1/4+1/4=0中,叶中的6在组1/2-1/4-1/4=0中
叶中的1位于-1/2+1/4-1/4=-1/2,依此类推
为了防止1/(2^x)四舍五入为零或其他问题,我们可以将因子(1/2、1/4、1/8…)乘以2h-1。事实上,在我写的第一个例子中,我们可以说因子乘以22-1
伪代码中的暴力方法:
columnAdd(tree):
sumPerColumn = new Map<int,int>();
traverse(tree.root, sumPerColumn, 0);
return sumPerColumn;
traverse(node, sumPerColumn, currentColumn):
sumPerColumn[currentColumn] ++;
traverse(node.left, sumPerColumn, currentColumn-1);
traverse(node.right, sumPerColumn, currentColumn+1);
据我所知,向左移动是-1,向右移动是+1。您可以使用修改后的dfs。这里假设定义了
add(col,value)
dfs(col, node)
begin
add(col, node.value)
if(haveLeft)
dfs(col-1, left)
if(haveRight)
dfs(col+1, right)
end
假设add在O(1)中起作用(例如使用HashMap或简单数组),它在O(n)中起作用。如何计算和?它是怎样垂直的?我已经编辑了这个问题。请找出垂直线。我不清楚垂直线是如何定义的。你能为一个多层次的树显示它吗?为什么节点1、5和6计算为在同一列中?如果树中还有另一个级别,5和6还会算在该列中吗?这个问题还很不清楚。为什么第5行与第1,3,6行相同?你是怎么做到“1,3,6”的?很有趣。检查你的算法。谢谢你。我认为你的算法不适用于高度超过2的二叉树。我编辑了答案。这适用于所有情况。你能检查你的算法适用于高度为5的树吗?@AnanthaKrishnan,只需添加一行边长为1/16的三角形(你可以在相应的图像中这样做),就可以了。事实上,这是一般性的。我想你的意思是
currentColumn-1
和currentColumn+1
,而不是-
和++
@svick:是的,这可能更清楚更正确:)。我会换的。
dfs(col, node)
begin
add(col, node.value)
if(haveLeft)
dfs(col-1, left)
if(haveRight)
dfs(col+1, right)
end