Algorithm 垂直打印二叉树

Algorithm 垂直打印二叉树,algorithm,binary-tree,Algorithm,Binary Tree,我想垂直打印一棵二叉树。我知道一个使用hashmap的解决方案。但是,我在很多地方读到,使用双链接列表可以实现这一点。不过,我不知道怎样做。我在网上也找不到任何可以理解的材料。有人能帮我用双链表法吗 例如: 5 4 3 6 7 8 9 这给 6 4 5 7 8 3 9 i、 它就像一个垂直顺序的水平顺序遍历 使用哈希映射的解决方案:假设根被索引为0,那么左边的将是-1,-2,等等。右边的将是+1,+2,等等。因此,我们可以在列号上构建一个哈

我想垂直打印一棵二叉树。我知道一个使用hashmap的解决方案。但是,我在很多地方读到,使用双链接列表可以实现这一点。不过,我不知道怎样做。我在网上也找不到任何可以理解的材料。有人能帮我用双链表法吗

例如:

        5
    4       3
  6   7   8   9
这给

6
4
5 7 8
3
9
i、 它就像一个垂直顺序的水平顺序遍历

使用哈希映射的解决方案:假设根被索引为0,那么左边的将是
-1
-2
,等等。右边的将是
+1
+2
,等等。因此,我们可以在列号上构建一个哈希键,并有一个以该特定列号为值的所有根的列表。然后我们可以简单地以散列方式打印条目

请参阅,阅读第1轮技术问题1的评论


我在许多其他地方也发现了类似的评论。

采访者的意思可能是将一个链表向下传递到树上,并给每个节点一个指向代表其列的列表元素的指针

只要想象一下链表在两个方向上都是无限的,您就可以在到达终点时轻松地扩展它。列表中的每一项都是节点列表:

function traverse(tree_node, list_node):
    if tree_node is NIL:
        return
    list_node.add(tree_node)
    traverse(tree_node.left, list_node.prev)
    traverse(tree_node.right, list_node.next)

以下是我在Objective-C中基于双链表的解决方案:

#导入
#进口
@接口ListNode:NSObject
+(ListNode*)nodeWithValue:(id)value next:(ListNode*)next previous:(ListNode*)previous;
@属性(非原子,强)ListNode*next;
@属性(非原子,强)ListNode*previous;
@属性(非原子,强)id值;
@结束
@实现列表节点
+(ListNode*)nodeWithValue:(id)value next:(ListNode*)next previous:(ListNode*)previous
{
ListNode*node=[[ListNode alloc]init];
node.value=值;
node.previous=previous;
node.next=next;
返回节点;
}
@结束
@接口树节点:NSObject
+(TreeNode*)nodeWithValue:(id)value left:(TreeNode*)left right:(TreeNode*)right;
@属性(非原子,强)树节点*左;
@属性(非原子,强)树节点*right;
@属性(非原子,强)id值;
@结束
@实现树节点
+(TreeNode*)nodeWithValue:(id)value left:(TreeNode*)left right:(TreeNode*)right
{
TreeNode*节点=[[TreeNode alloc]init];
node.value=值;
node.left=左;
node.right=右;
返回节点;
}
@结束
ListNode*垂直遍历(TreeNode*节点,ListNode*列表)
{
如果(!节点){
退货清单;
}
[((NSMutableArray*)list.value)addObject:node.value];
ListNode*头=列表;
if(节点左){
如果(!list.previous){
list.previous=[ListNode nodeWithValue:[NSMutableArray]下一步:列表上一步:nil];
}
head=垂直遍历(node.left,list.previous);
}
if(node.right){
如果(!list.next){
list.next=[ListNodeNodeWithValue:[NSMutableArray]next:nil previous:list];
}
垂直遍历(node.right,list.next);
}
回流头;
}
无效垂直打印(TreeNode*根)
{
ListNode*list=[ListNode nodeWithValue:[NSMutableArray]下一个:nil上一个:nil];
ListNode*head=垂直遍历(根,列表);
ListNode*next=头部;
NSInteger级别=0;
while(下一个){
NSArray*数组=(NSArray*)(next.value);
NSLog(@“%li:%@”,级别,[数组组件通过字符串连接:@,“]);
next=next.next;
级别++;
}
}
int main(int argc,const char*argv[]
{
@自动释放池{
TreeNode*tree=[TreeNodeWithValue:@1
左:[TreeNodeWithValue:@2左:[TreeNodeWithValue:@4左:零右:零]右:[TreeNodeWithValue:@5左:零右:零]]
右:[TreeNodeWithValue:@3左:[TreeNodeWithValue:@6左:无右:无]右:[TreeNodeWithValue:@7左:无右:无]];
垂直印刷(树);
}
}

定义“垂直打印”并描述您的hashmap解决方案,还请链接到讨论双链接列表的位置“给定字符串,显示该字符串中多次出现的字符”。您通过
char
迭代
char
,使用
char,int
映射,将所有
char
s馈送到
map
,最后打印出现次数超过1次的每个键。当然,C++中使用的是<代码> map <代码>,但是任何关联容器都会这样做。<代码> 5 4、3、6、7、8、9、< /代码>没有排序。如果我对它进行排序并建立一棵树,我现在就知道你如何到达
6457839
@NiklasB。为什么需要对其进行排序?只需填写水平。将其视为级别顺序遍历。@ USER 1414358:6必须是根,而三必须是最左边的节点。不确定你所说的“等级秩序”是什么意思,我认为这是正确的。谢谢!:)@MukulJain在这种情况下,算法将输出
[[n2],[n1,n3],[n4]]
,这对我来说似乎是正确的。有人能解释一下吗,因为我无法清楚地了解这一点。