计数位于给定范围内的BST节点

给定一个二叉搜索树(BST)和一个范围,计算位于给定范围内的节点数。 例如:

null
Input:        10      /        5       50   /       /   1       40   100Range: [5, 45]Output:  3There are three nodes in range, 5, 10 and 40

其思想是从根开始遍历给定的二叉搜索树。对于每个被访问的节点,检查该节点是否在范围内,如果是,则在结果中添加1,并对其两个子节点重复出现。如果当前节点小于范围的下限值,则右子节点重复出现,否则左子节点重复出现。 下面是上述想法的实现。

C++

// C++ program to count BST nodes within a given range
#include<bits/stdc++.h>
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
# within 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


Javascript

<script>
// javascript code to count BST nodes that
// lie in a given range
/*
* Class containing left and right child of current node and key value
*/
class Node {
constructor(item) {
this .data = item;
this .left = this .right = null ;
}
}
// Root of BST
var root = null ;
// Returns count of nodes in BST in
// range [low, high]
function getCount( node , low , 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
root = new Node(10);
root.left = new Node(5);
root.right = new Node(50);
root.left.left = new Node(1);
root.right.left = new Node(40);
root.right.right = new Node(100);
/*
* Let us constructed BST shown in above example 10 / 5 50 / / 1 40 100
*/
var l = 5;
var h = 45;
document.write( "Count of nodes between [" + l + ", " + h + "] is " + getCount(root, l, h));
// This code contributed by aashish1995
</script>


输出:

Count of nodes between [5, 45] is 3

上述程序的时间复杂度为O(h+k),其中h是BST的高度,k是给定范围内的节点数。

https://youtu.be/jfk

-uX_xKK4?list=PLqM7alHXFySHCXD7r1J0ky9Zg_GBB1dbk 本文由 高拉夫·阿希瓦 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享