垂直打印二叉树

时间:2014-03-16 17:22:05

标签: algorithm binary-tree

我想垂直打印二叉树。我知道使用hashmap的解决方案。但是,我在许多地方读过,可以通过使用双向链表来完成。但是,我无法弄清楚如何做到这一点。我也无法在网上找到任何可以理解的材料。有人可以用双向链表方法帮助我吗?

示例:

        5
    4       3
  6   7   8   9

这给出了

6
4
5 7 8
3
9

即。它就像一个垂直顺序的水平顺序遍历。

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

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

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

2 个答案:

答案 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);
    }
}