垂直打印给定的一棵二叉树。下面的例子演示了垂直遍历的顺序。
1
/ \
2 3
/ \ / \
4 5 6 7
\ \
8 9
对这棵树的垂直遍历结果为:
4
2
1 5 6
3 8
7
9
在二叉树系列中,已经讨论过了一种O(n2)的方案。在本篇中,将讨论一种基于哈希表的更优的方法。
首先在水平方向上检测所有节点到root的距离。如果两个node拥有相同的水平距离(Horizontal Distance,简称HD),则它们在相同的垂直线上。root自身的HD为0,右侧的node的HD递增,即+1,而左侧的node的HD递减,即-1。
例如,上面的那棵树中,Node4的HD为-2, 而Node5和Node6的HD为0,Node7的HD为2。
可以对二叉树做先序遍历。在遍历的过程中,可以递归的计算HD的值。首先指定root HD为0。对于左子树,递归的-1,而对于右子树,递归的+1。
对于每一个HD值,我们在哈希表中维护一个节点链表。当遍历时每获取到一个节点,则将此node插入到哈希表中,利用它的HD做为key。
下面是上述方法的C++实现。
// 垂直的打印一棵二叉树
#include <iostream>
#include