给定一棵二叉树,求同一垂直线上的节点的垂直总和。通过不同的垂直线打印所有总和。
要了解什么是相同的垂直线,我们需要先定义水平距离。如果两个节点具有相同的水平距离 (HD),则它们位于同一垂直线上。高清的想法很简单。根的HD为0,右边缘(连接右子树的边缘)被认为是+1水平距离,左边缘被认为是-1水平距离。例如,在上面的树中,节点 4 的 HD 为 -2,节点 2 的 HD 为 -1,5 和 6 的 HD 为 0,节点 7 的 HD 为 +2。
例子:
1
/ \
2 3
/ \ / \
4 5 6 7
这棵树有 5 条垂直线
Vertical-Line-1 只有一个节点 4 => 垂直总和为 4
Vertical-Line-2:只有一个节点 2=> 垂直总和为 2
Vertical-Line-3:具有三个节点:1,5,6 => 垂直总和为 1+5+6 = 12
Vertical-Line-4:只有一个节点 3 => 垂直总和为 3
Vertical-Line-5:只有一个节点 7 => 垂直总和为 7
所以预期的输出是 4、2、12、3 和 7
我的解决方案: 我想出了针对这个问题的 ao(nlong(n)) 解决方案。这个想法是:
(1) 使用前序遍历得到每个节点的HD,并将HD及其关联节点存储在一个数组中。
(2) 按HD对数组进行排序
(3) 遍历排序后的数组打印结果。
我确定这不是解决此问题的最佳方法。谁能帮我提供更好的解决方案?