使用递归在二进制搜索树中查找固定后继
Finding In-Order Successor in Binary Search tree Using Recursion
我需要在二进制搜索树中找到订购后继。例如,给定格式的树:
4
/
2 7
并传递2个搜索值2,订购后继者为4。
相关代码:
template <typename T, typename Compare=std::less<T>>class BinarySearchTree {
private:
struct Node {
// Default constructor - does nothing
Node() {}
// Custom constructor provided for convenience
Node(const T &datum_in, Node *left_in, Node *right_in)
: datum(datum_in), left(left_in), right(right_in) { }
T datum;
Node *left;
Node *right;
};
这是我的功能搜索订购后继
static Node * min_greater_than_impl(Node *node, const T &val, Compare less) {
// base case: empty tree
if (node == nullptr) {
return nullptr;
}
// base case: no such element exists
if (less((max_element_impl(node))->datum, val) || (!less((max_element_impl(node))->datum, val)
&& !less(val, (max_element_impl(node))->datum))){
return nullptr;
}
// recursive case: go right
if (less(node->datum, val)) {
if (node->right != nullptr) {
return min_greater_than_impl(node->right, val, less);
}
}
// recursive case: go left
else if (less(val, node->datum)) {
if (node->left != nullptr) {
return min_greater_than_impl(node->left, val, less);
}
}
// recurisve case: nequal to node, go right
else {
if (node->right != nullptr) {
return min_greater_than_impl(node->right, val, less);
}
}
return node;
}
现在,我相信问题是我的功能实际上何时在所需的节点上。我认为我需要在功能末尾的语句中可能在额外的基本案例或其他情况下检查一下。但是,如果不对当前节点进行递归电话,我无法想到该怎么做,但这只是无限循环。
最简单的方法是添加父指针。然后要获得"下一个",上升到找到兄弟姐妹。
如果您无法使用父母,通常出于充分的理由(例如,树允许重复的子分支),则必须在下降时保留自己的父对象堆栈。要获取下一个物体,如果我们是左叶,那是父母,如果我们是右叶曾祖父母的叶子。(如果我们碰到根,那么我们的节点是最后一个正确的叶子)。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 正在尝试重载二进制搜索树分配运算符
- 使用C++创建特殊的二叉搜索树
- 在递归二叉搜索树中搜索
- 在二叉搜索树中插入时出现分段错误
- C++二叉搜索树模板从函数返回节点
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 在二叉搜索树C++中计算平均值
- 在字符串的二叉搜索树中搜索子字符串 - C++
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 在二叉搜索树中查找元素
- 在二叉搜索树中查找最小和的算法改进
- 二叉搜索树查找和删除 [C++]
- 使用递归在二进制搜索树中查找固定后继
- 如何在二叉搜索树中查找元素
- 在二进制搜索树中查找第二个最大元素
- 在二叉搜索树中查找第 n 个最小元素
- 如何在二叉搜索树节点中查找次要元素的平均值
- 查找所有唯一二叉搜索树的算法的时间复杂度是多少?
- 在二进制搜索树中查找最深级别的左叶节点