假设我有一个Binary Search Tree

        50
     /       \
    17        72
  /    \     /   \
 12    23   54   76
 /\    /     \
9 14  19     67

对不起,我画树很烂
我想返回在一定范围内的所有节点。例如
[12, 23] --> {12, 14, 17, 23, 19}

我的方法很简单
查找LCA
查找下限
while节点!=lca.parent,添加右子树
从LCA,while node!=上界,添加左子树
添加上界的上界和左子树
但是,如果树中不包含一个或两个边界怎么办。例如
[11, 72] --> {12, 14, 17, 23, 19, 50, 54, 67, 72}

我的方法看起来很相似,除了不搜索边界,而是搜索直到节点子节点超出了您的边界。因此,在找到“LCA”(不是一个真正的LCA,因为它不存在),寻找11。到了12点后,看到左边的孩子还不到11岁,就停下来。
是否有更有效的解决方案来执行此范围查询?BST并不是强制的,它看起来只是一个很好的数据结构。
当树中不包含边界时,我的方法是否有效?

最佳答案

正如@nico所建议的,您只需要一个递归算法来遍历树,而不需要关心lca。事实上,二叉树是一个二叉搜索树,允许您执行一些优化并避免遍历整个树如果节点的值低于您的下限,请不要遍历节点的左分支。

void FindNodesInBound(BSTNode node, int lowerBound, int upperBound, List<int> matches) {
    if (node != null) {
        if (node.Value >= lowerBound)
            FindNodesInBound(node.Left, lowerBound, upperBound, matches);
        if (node.Value >= lowerBound && node.Value <= upperBound)
            matches.Add(node.Value);
        if (node.Value <= upperBound)
            FindNodesInBound(node.Right, lowerBound, upperBound, matches);
    }
}

09-27 22:07