我想垂直打印二叉树。我知道使用hashmap的解决方案。但是,我在许多地方读过,可以通过使用双向链表来完成。但是,我无法弄清楚如何做到这一点。我也无法在网上找到任何可以理解的材料。有人可以用双向链表方法帮助我吗?
示例:
5
4 3
6 7 8 9
这给出了
6
4
5 7 8
3
9
即。它就像一个垂直顺序的水平顺序遍历。
使用哈希映射的解决方案:假设根被索引为0,则左边的索引为-1
,-2
等,右边的索引为+1
,{{1因此,我们可以构建一个以列号为键的哈希值,并列出所有具有该特定列号作为值的根。然后我们可以简单地用哈希打印条目。
请参阅this link,阅读第1轮的评论,技术问题1.
我在其他许多地方也发现了同样的评论。
答案 0 :(得分:5)
访调员可能的意思是在树下传递一个链表,并为每个节点指定一个指向其列的列表元素的指针。
想象一下,链接列表在两个方向都是无限的,只要你结束就可以轻松扩展它。列表中的每个项目依次是节点列表:
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)
答案 1 :(得分:1)
以下是Objective-C中基于双链表的解决方案:
#import <Foundation/Foundation.h>
#import <stdio.h>
@interface ListNode : NSObject
+ (ListNode *)nodeWithValue:(id)value next:(ListNode *)next previous:(ListNode *)previous;
@property (nonatomic, strong) ListNode *next;
@property (nonatomic, strong) ListNode *previous;
@property (nonatomic, strong) id value;
@end
@implementation ListNode
+ (ListNode *)nodeWithValue:(id)value next:(ListNode *)next previous:(ListNode *)previous
{
ListNode *node = [[ListNode alloc] init];
node.value = value;
node.previous = previous;
node.next = next;
return node;
}
@end
@interface TreeNode : NSObject
+ (TreeNode *)nodeWithValue:(id)value left:(TreeNode *)left right:(TreeNode *)right;
@property (nonatomic, strong) TreeNode *left;
@property (nonatomic, strong) TreeNode *right;
@property (nonatomic, strong) id value;
@end
@implementation TreeNode
+ (TreeNode *)nodeWithValue:(id)value left:(TreeNode *)left right:(TreeNode *)right
{
TreeNode *node = [[TreeNode alloc] init];
node.value = value;
node.left = left;
node.right = right;
return node;
}
@end
ListNode *verticalTraversal(TreeNode *node, ListNode *list)
{
if (!node) {
return list;
}
[((NSMutableArray *)list.value) addObject:node.value];
ListNode *head = list;
if (node.left) {
if (!list.previous) {
list.previous = [ListNode nodeWithValue:[NSMutableArray array] next:list previous:nil];
}
head = verticalTraversal(node.left, list.previous);
}
if (node.right) {
if (!list.next) {
list.next = [ListNode nodeWithValue:[NSMutableArray array] next:nil previous:list];
}
verticalTraversal(node.right, list.next);
}
return head;
}
void verticalPrint(TreeNode *root)
{
ListNode *list = [ListNode nodeWithValue:[NSMutableArray array] next:nil previous:nil];
ListNode *head = verticalTraversal(root, list);
ListNode *next = head;
NSInteger level = 0;
while (next) {
NSArray *array = (NSArray *)(next.value);
NSLog(@"%li: %@", level, [array componentsJoinedByString:@", "]);
next = next.next;
level ++;
}
}
int main (int argc, const char * argv[])
{
@autoreleasepool {
TreeNode *tree = [TreeNode nodeWithValue:@1
left:[TreeNode nodeWithValue:@2 left:[TreeNode nodeWithValue:@4 left:nil right:nil] right:[TreeNode nodeWithValue:@5 left:nil right:nil]]
right:[TreeNode nodeWithValue:@3 left:[TreeNode nodeWithValue:@6 left:nil right:nil] right:[TreeNode nodeWithValue:@7 left:nil right:nil]]];
verticalPrint(tree);
}
}