📜  门| GATE-CS-2014-(Set-3) |第 56 题(1)

📅  最后修改于: 2023-12-03 15:12:42.350000             🧑  作者: Mango

GATE-CS-2014 (Set-3) | Question 56

该问题在GATE 2014年计算机科学考试(第3组)中提出。 以下是问题的陈述:

以下是一个使用队列实现的二叉树转置函数。下面给出了程序的主体的伪代码。在适当的地方填入适当的代码。

public void reverseLevelOrder() {
    Queue<Node> q = new LinkedList<Node>();
    Stack<Node> s = new Stack<Node>();
    q.add(root);
    while (!q.isEmpty()) {
        Node temp = q.poll();
        if (temp.right != null) {
            q.add(temp.right);
        }
        if (temp.left != null) {
            q.add(temp.left);
        }
       __________________
    }
    while (!s.isEmpty()) {
        Node temp = s.pop();
        System.out.println(temp.data);
    }
}

在这个问题中,我们需要填写代码以输出二叉树的逆层序遍历。我们可以使用广度优先搜索(BFS)来遍历二叉树的节点,并使用一个堆栈来反转节点的顺序。 一旦堆栈被填满(即堆栈中没有顶部节点可以弹出),我们可以使用pop函数从堆栈中弹出节点,并将其值打印出来。

在上面给出的伪代码中,我们需要填写的代码位于while循环的末尾。我们可以使用以下代码将当前节点推入堆栈中:

s.push(temp);

最终,我们的完整函数应该如下所示:

public void reverseLevelOrder() {
    Queue<Node> q = new LinkedList<Node>();
    Stack<Node> s = new Stack<Node>();
    q.add(root);
    while (!q.isEmpty()) {
        Node temp = q.poll();
        if (temp.right != null) {
            q.add(temp.right);
        }
        if (temp.left != null) {
            q.add(temp.left);
        }
        s.push(temp);
    }
    while (!s.isEmpty()) {
        Node temp = s.pop();
        System.out.println(temp.data);
    }
}

这个函数的时间复杂度为O(n),其中n是树中的节点数。 因为我们必须访问每个节点一次才能完成反转,所以这是最佳的时间复杂度。