Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 求二叉搜索树的中位数,C++;_C++_Algorithm_Vector_Time Complexity_Binary Search Tree - Fatal编程技术网

C++ 求二叉搜索树的中位数,C++;

C++ 求二叉搜索树的中位数,C++;,c++,algorithm,vector,time-complexity,binary-search-tree,C++,Algorithm,Vector,Time Complexity,Binary Search Tree,有一次,我接受了“一家知名公司”的面试,面试官让我找出BST的中位数 int median(treeNode* root) { } 我开始实施我提出的第一个暴力解决方案。我将所有数据填充到一个std::vector中,使用顺序遍历(将所有内容排序到向量中),并获得中间元素。 因此,我的算法是O(N),用于插入向量中的每个元素,并使用O(1),+O(N)内存查询中间元素。 那么,有没有更有效的方法(在记忆或复杂性方面)来做同样的事情。 提前谢谢 二叉树为您的数据提供了一个排序视图,但为了利用它

有一次,我接受了“一家知名公司”的面试,面试官让我找出BST的中位数

int median(treeNode* root)
{

}
我开始实施我提出的第一个暴力解决方案。我将所有数据填充到一个
std::vector
中,使用顺序遍历(将所有内容排序到向量中),并获得中间元素。 因此,我的算法是O(N),用于插入向量中的每个元素,并使用O(1),+O(N)内存查询中间元素。 那么,有没有更有效的方法(在记忆或复杂性方面)来做同样的事情。

提前谢谢

二叉树为您的数据提供了一个排序视图,但为了利用它,您需要知道每个子树中有多少个元素。因此,如果没有这些知识,您的算法足够快


如果您知道每个子树的大小,您可以选择每次访问左子树或右子树,如果二叉树是平衡的,这将给出一个
O(logn)
算法。

二叉树为您的数据提供一个排序视图,但为了利用它,您需要知道每个子树中有多少元素。因此,如果没有这些知识,您的算法足够快


如果您知道每个子树的大小,您可以选择每次访问左子树或右子树,如果二叉树是平衡的,这将给出一个
O(logn)
算法。

因为您知道中位数是已排序元素列表的中间元素,您只需获取顺序遍历的中间元素并在那里停止,而无需将值存储在向量中。如果不知道节点数,可能需要进行两次遍历,但这将使解决方案使用更少的内存(
O(h)
其中
h
是树的高度;
h=O(logn)
用于平衡搜索树)


如果你可以扩充树,你可以使用我给出的解决方案得到一个
O(logn)
算法。

因为你知道中位数是元素排序列表的中间元素,你可以只取顺序遍历的中间元素并停在那里,而不用将值存储在向量中。如果不知道节点数,可能需要进行两次遍历,但这将使解决方案使用更少的内存(
O(h)
其中
h
是树的高度;
h=O(logn)
用于平衡搜索树)

如果你可以扩充树,你可以使用我给出的解决方案得到一个
O(logN)
算法。

它可以在
O(n)
时间和
O(logN)
空间中完成,方法是按顺序遍历,当你到达
n/2
th节点时停止,只需携带一个计数器,告诉您已经遍历了多少个节点——无需实际填充任何向量

如果您可以将树修改为秩树(每个节点也有关于它是其根的子树中节点数的信息),只需将n/2个元素的方向向前移动,就可以轻松地在O(logN)时间内解决它。

可以在
O(n)
时间和
O(logN)时间内完成
通过按顺序遍历并在到达
n/2
th节点时停止,只需携带一个计数器,告诉您已经遍历了多少个节点-无需实际填充任何向量


如果您可以将树修改为秩树(每个节点还具有子树中作为其根的节点数的信息),只需将n/2个元素的方向向前移动,即可在O(logN)时间内轻松解决该问题。

如果您可以将树修改为秩树(每个节点还包含子树中作为其根的节点数),它可以在O(logn)时间和空间内完成,而无需更改树的插入/删除/搜索。如果您可以将树修改为秩树(每个节点还包含其作为根的子树中的节点数),则可以在O(logn)时间和空间内完成,而无需更改树的插入/删除/搜索。是否可以使用
O完成(1) 
rank trees的额外内存?我们只关心该解决方案中的当前节点。@IVlad我想你是对的,我是递归地思考的,但是只保持当前值就迭代地执行它没有问题。不能用
O(1)来完成吗
rank trees的额外内存?我们只关心该解决方案中的当前节点。@IVlad我想你是对的,我一直在递归地思考,但如果只保持当前节点,那么以迭代的方式进行思考是没有问题的。