一棵二叉树的看法从45度

时间:2018-05-04 17:51:52

标签: data-structures binary-tree tree-traversal

所以我不是要求树的对角线视图,幸运的是我已经知道了。我问我是否从45度角查看树只有几个节点应该是可见的。因此,存在一个与x轴成45度角的平面。所以我们需要打印从该平面可见的所有节点。

例如:

            1
          /    \
          2      3
        /  \    /  \
       4   5   6    7

因此,如果我从那个平面看,我只会看到节点[4,6,7]为5和6彼此重叠。如果我在6处添加另一个节点,现在它将隐藏7.如何做到这一点?我在网上搜索但找不到答案。

谢谢!

1 个答案:

答案 0 :(得分:0)

我给你一个抽象的答案,因为这个问题不是语言特定的。

像这样记录树的问题是使用递归。

我的意思是遍历正在向下节点和向上节点。

如果您编写了一个可以返回当前节点深度的高度助手,该怎么办?

对于每个深度级别,将值放在数组中。

然后,写入数组的值。

然后你可以获取最后一个数组的长度并确定每个节点所需的空间量。

允许数组保存空值,否则你必须跟踪哪些节点没有子节点。

int total_depth = tree.getTotalHeight();
int arr[total_depth] = {};
for(int i = total_depth; i--;){
   // there is a formula for the max number of nodes at a given depth of a binary tree
   arr[i] = int arr[maximum_nodes_at_depth]
}
tree.inorderTraverse(function(node){
    int depth = node.getHeightHelper();
    // check if item is null
    if( node!=nullptr && node.Item != NULL)
    {
        arr[depth].push(node.Item)
    }
    else
    {
        arr[depth].push(NULL)    
    }
})

所以现在你必须计算树的大小,然后动态计算每个节点前面有多少个空格。深度越低,以它为中心的前缀空间越多。

我道歉但是伪代码是javascript和c ++语法的混合....这应该永远不会发生lol