给定二分搜索树(BST)和一个范围,计算位于给定范围内的节点数。
例子:
Input:
10
/ \
5 50
/ / \
1 40 100
Range: [5, 45]
Output: 3
There are three nodes in range, 5, 10 and 40
这个想法是从根开始遍历给定的二进制搜索树。对于正在访问的每个节点,请检查该节点是否在范围内,如果是,则将结果加1并为其两个子节点重复。如果当前节点小于范围的下限值,则对右子节点递归,否则对左子节点递归。
以下是上述想法的实现。
C++
// C++ program to count BST nodes withing a given range
#include
using namespace std;
// A BST node
struct node
{
int data;
struct node* left, *right;
};
// Utility function to create new node
node *newNode(int data)
{
node *temp = new node;
temp->data = data;
temp->left = temp->right = NULL;
return (temp);
}
// Returns count of nodes in BST in range [low, high]
int getCount(node *root, int low, int high)
{
// Base case
if (!root) return 0;
// Special Optional case for improving efficiency
if (root->data == high && root->data == low)
return 1;
// If current node is in range, then include it in count and
// recur for left and right children of it
if (root->data <= high && root->data >= low)
return 1 + getCount(root->left, low, high) +
getCount(root->right, low, high);
// If current node is smaller than low, then recur for right
// child
else if (root->data < low)
return getCount(root->right, low, high);
// Else recur for left child
else return getCount(root->left, low, high);
}
// Driver program
int main()
{
// Let us construct the BST shown in the above figure
node *root = newNode(10);
root->left = newNode(5);
root->right = newNode(50);
root->left->left = newNode(1);
root->right->left = newNode(40);
root->right->right = newNode(100);
/* Let us constructed BST shown in above example
10
/ \
5 50
/ / \
1 40 100 */
int l = 5;
int h = 45;
cout << "Count of nodes between [" << l << ", " << h
<< "] is " << getCount(root, l, h);
return 0;
}
Java
// Java code to count BST nodes that
// lie in a given range
class BinarySearchTree {
/* Class containing left and right child
of current node and key value*/
static class Node {
int data;
Node left, right;
public Node(int item) {
data = item;
left = right = null;
}
}
// Root of BST
Node root;
// Constructor
BinarySearchTree() {
root = null;
}
// Returns count of nodes in BST in
// range [low, high]
int getCount(Node node, int low, int high)
{
// Base Case
if(node == null)
return 0;
// If current node is in range, then
// include it in count and recur for
// left and right children of it
if(node.data >= low && node.data <= high)
return 1 + this.getCount(node.left, low, high)+
this.getCount(node.right, low, high);
// If current node is smaller than low,
// then recur for right child
else if(node.data < low)
return this.getCount(node.right, low, high);
// Else recur for left child
else
return this.getCount(node.left, low, high);
}
// Driver function
public static void main(String[] args) {
BinarySearchTree tree = new BinarySearchTree();
tree.root = new Node(10);
tree.root.left = new Node(5);
tree.root.right = new Node(50);
tree.root.left.left = new Node(1);
tree.root.right.left = new Node(40);
tree.root.right.right = new Node(100);
/* Let us constructed BST shown in above example
10
/ \
5 50
/ / \
1 40 100 */
int l=5;
int h=45;
System.out.println("Count of nodes between [" + l + ", "
+ h+ "] is " + tree.getCount(tree.root,
l, h));
}
}
// This code is contributed by Kamal Rawal
Python3
# Python3 program to count BST nodes
# withing a given range
# Utility function to create new node
class newNode:
# Constructor to create a new node
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# Returns count of nodes in BST in
# range [low, high]
def getCount(root, low, high):
# Base case
if root == None:
return 0
# Special Optional case for improving
# efficiency
if root.data == high and root.data == low:
return 1
# If current node is in range, then
# include it in count and recur for
# left and right children of it
if root.data <= high and root.data >= low:
return (1 + getCount(root.left, low, high) +
getCount(root.right, low, high))
# If current node is smaller than low,
# then recur for right child
elif root.data < low:
return getCount(root.right, low, high)
# Else recur for left child
else:
return getCount(root.left, low, high)
# Driver Code
if __name__ == '__main__':
# Let us construct the BST shown in
# the above figure
root = newNode(10)
root.left = newNode(5)
root.right = newNode(50)
root.left.left = newNode(1)
root.right.left = newNode(40)
root.right.right = newNode(100)
# Let us constructed BST shown in above example
# 10
# / \
# 5 50
# / / \
# 1 40 100
l = 5
h = 45
print("Count of nodes between [", l, ", ", h,"] is ",
getCount(root, l, h))
# This code is contributed by PranchalK
C#
using System;
// C# code to count BST nodes that
// lie in a given range
public class BinarySearchTree
{
/* Class containing left and right child
of current node and key value*/
public class Node
{
public int data;
public Node left, right;
public Node(int item)
{
data = item;
left = right = null;
}
}
// Root of BST
public Node root;
// Constructor
public BinarySearchTree()
{
root = null;
}
// Returns count of nodes in BST in
// range [low, high]
public virtual int getCount(Node node, int low, int high)
{
// Base Case
if (node == null)
{
return 0;
}
// If current node is in range, then
// include it in count and recur for
// left and right children of it
if (node.data >= low && node.data <= high)
{
return 1 + this.getCount(node.left, low, high) + this.getCount(node.right, low, high);
}
// If current node is smaller than low,
// then recur for right child
else if (node.data < low)
{
return this.getCount(node.right, low, high);
}
// Else recur for left child
else
{
return this.getCount(node.left, low, high);
}
}
// Driver function
public static void Main(string[] args)
{
BinarySearchTree tree = new BinarySearchTree();
tree.root = new Node(10);
tree.root.left = new Node(5);
tree.root.right = new Node(50);
tree.root.left.left = new Node(1);
tree.root.right.left = new Node(40);
tree.root.right.right = new Node(100);
/* Let us constructed BST shown in above example
10
/ \
5 50
/ / \
1 40 100 */
int l = 5;
int h = 45;
Console.WriteLine("Count of nodes between [" + l + ", " + h + "] is " + tree.getCount(tree.root, l, h));
}
}
// This code is contributed by Shrikant13
输出:
Count of nodes between [5, 45] is 3
上面程序的时间复杂度是O(h + k),其中h是BST的高度,k是给定范围内的节点数。