我们可以在不知道二叉查找树的高度的情况下使用顺序遍历找到第k个最大的元素吗?或者有没有一种方法可以让我们创建一个新的遍历模式,比如“右根向左”
你说的是简单的二叉树还是像AVL树这样的树?
如果我理解正确,你根本不需要知道高度...顺序遍历-右根左-应该从最高值到最低值。
每次输入函数时,可以增加一个静态变量(或向函数发送另一个参数),直到达到K。
您还可以维护一个度树,并直接知道在哪里通过该树。
这个怎么样:
x=T.root;而(x-
在BST上实现前置和后续方法并不困难,而且当节点具有指向父节点的额外指针时,实现起来也很容易。
在不知道二叉搜索树的高度的情况下,我们是否可以通过按序遍历找到第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。 请帮帮我吧!