提供树的左/右视图的有效代码是什么。
例如:

                                1
                              /   \
     left view--->>          4     7                    <<--right view
                            / \   /
                           3   2  9
                                 /
                                8

此树的左视图为-1 4 3 8,右视图为-1 7 9 8
我试过水平顺序遍历,但是如果树上缺少一些子节点,那么我很难找到水平的起点(在左视图的情况下)或终点(在右视图的情况下),请给出建议

最佳答案

你说得对,水平顺序遍历

Queue<Node> queue = new ArrayDeque<Node>();
for (Node node = root; node != null; node = queue.poll()) {
    if (node.leftChild != null) queue.add(node.leftChild);
    if (node.rightChild != null) queue.add(node.rightChild);
}

很难知道一个层次的结束和下一个层次的开始。这可以通过使用两个队列来解决。
Queue<Node> currentLevel = new ArrayDeque<Node>();
if (root != null) currentLevel.add(root);
while (true) {
    Node node = currentLevel.poll();
    if (node == null) break;
    /* node is the leftmost on its level */
    Queue<Node> nextLevel = new ArrayDeque<Node>();
    do {
        if (node.leftChild != null) nextLevel.add(node.leftChild);
        if (node.rightChild != null) nextLevel.add(node.rightChild);
        node = currentLevel.poll();
    } while (node != null);
    currentLevel = nextLevel;
}

07-24 09:38