当前位置: 首页 > 知识库问答 >
问题:

使用不知道二叉查找树高度的顺序遍历的第k大元素

谭修竹
2023-03-14

我们可以在不知道二叉查找树的高度的情况下使用顺序遍历找到第k个最大的元素吗?或者有没有一种方法可以让我们创建一个新的遍历模式,比如“右根向左”

共有3个答案

艾浩广
2023-03-14

你说的是简单的二叉树还是像AVL树这样的树?

如果我理解正确,你根本不需要知道高度...顺序遍历-右根左-应该从最高值到最低值。

每次输入函数时,可以增加一个静态变量(或向函数发送另一个参数),直到达到K。

您还可以维护一个度树,并直接知道在哪里通过该树。

窦凯定
2023-03-14

这个怎么样:

  • 设x为对应于树的最小元素的节点(例如,x=T.root;而(x-

在BST上实现前置和后续方法并不困难,而且当节点具有指向父节点的额外指针时,实现起来也很容易。

范建华
2023-03-14

在不知道二叉搜索树的高度的情况下,我们是否可以通过按序遍历找到第k个最大的元素<是的,我们可以我们可以使用一些额外的空间来完成。我们不一定需要做右根左来找出kth最大的元素(尽管这样做可以避免使用额外的空间)。

有几种方法。

最基本的是有一个队列。

无论何时,只要按顺序遍历,请继续在队列中插入值。不用说,由于它是二叉查找树,队列将被排序。因此,kth最大的元素位于queue.size()-1-k索引处。(假设第0个largrst是最大元素,第一个最大的是第二个最大元素,以此类推)这种方法需要额外的空间,而不管k

为了优化使用的空间,我们可以使用关于k
的信息。注意,我们只需要(queue.size()-1-k)第个索引处的元素。因此,我们可以有一个大小为(k1)的队列。在插入元素之前,我们将检查队列是否有超过k个元素,如果有,我们将从前面删除一个元素,因为我们不需要它
遍历完成后,kth最大的元素将位于队列的前面。

以下是这两种方法的java实现:

import java.util.LinkedList;
import java.util.Queue;

class Node {
    int data;
    Node left;
    Node right;

    static Queue<Integer> efficient = new LinkedList<>();
    static Queue<Integer> complete = new LinkedList<>();

    Node(int n) {
        this.data = n;
        this.left = null;
        this.right = null;
    }

    public static void inorder(Node node, int k) {
        if (node == null) {
            return;
        }
        inorder(node.left, k);
        if (efficient.size() > k) {
            efficient.poll();
        }
        efficient.add(node.data);
        complete.add(node.data);
        System.out.println(efficient.toString());
        inorder(node.right, k);
    }

    public static void main(String[] args) {
        Node root = new Node(7);
        root.left = new Node(4);
        root.left.left = new Node(1);
        root.left.right = new Node(5);
        root.left.right.right = new Node(6);
        root.right = new Node(9);
        int k = 2;
        inorder(root, k);
        System.out.println("Efficient queue size : " + efficient.size() + " " + efficient.peek());
        System.out.println("Full queue size : " + complete.size() + " " + complete.toArray()[complete.size() - 1 - k]);

    }

}

运行此命令,您将了解队列的增长效率请注意,此处,k应小于树中的节点数。如果不是,那么答案将是最小的元素。

其他方法使用实现更通用的解决方案。在这种情况下,树不需要是二进制搜索树。

 类似资料:
  • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。

  • 我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。

  • 我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc

  • 我正在学习如何使用Postorder遍历删除二叉树。我知道要删除一个节点,首先我们需要删除它的子节点,然后是节点本身,所以Postorder遍历最适合删除二叉树。我想使用Inorder遍历做同样的事情,一切都很好,但我不明白下面的代码是如何工作的?

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问

  • 我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!