给定一个BST和一个关键节点,在BST中找到总和,除了那些与关键节点相邻的节点。
例子:
1:-首先找到BST的总和
2:-搜索关键节点并跟踪其父节点。
3:-如果存在关键节点,则从总和中减去其相邻节点的总和
4:-如果BST中不存在密钥,则返回-1。
C++
// C++ program to find total sum except a given Node in BST
#include
using namespace std;
struct Node {
int data;
struct Node *left, *right;
};
// insertion of Node in Tree
Node* getNode(int n)
{
struct Node* root = new Node;
root->data = n;
root->left = NULL;
root->right = NULL;
return root;
}
// total sum of bst
int sum(struct Node* root)
{
if (root == NULL)
return 0;
return root->data + sum(root->left) + sum(root->right);
}
// sum of all element except those which are adjecent to key Node
int adjSum(Node* root, int key)
{
int parent = root->data;
while (root != NULL) {
if (key < root->data) {
parent = root->data;
root = root->left;
}
else if (root->data == key) // key Node matches
{
// if the left Node and right Node of key is
// not null then add all adjecent Node and
// substract from totalSum
if (root->left != NULL && root->right != NULL)
return (parent + root->left->data +
root->right->data);
// if key is leaf
if (root->left == NULL && root->right == NULL)
return parent;
// If only left child is null
if (root->left == NULL)
return (parent + root->right->data);
// If only right child is NULL
if (root->right == NULL)
return (parent + root->left->data);
}
else {
parent = root->data;
root = root->right;
}
}
return 0;
}
int findTotalExceptKey(Node *root, int key)
{
return sum(root) - adjSum(root, key);
}
// Driver code
int main()
{
struct Node* root = getNode(15);
root->left = getNode(13);
root->left->left = getNode(12);
root->left->left->left = getNode(11);
root->left->right = getNode(14);
root->right = getNode(20);
root->right->left = getNode(18);
root->right->right = getNode(24);
root->right->right->left = getNode(23);
root->right->right->right = getNode(25);
int key = 20;
printf("%d ", findTotalExceptKey(root, key));
return 0;
}
Java
// Java program to find total sum
// except a given Node in BST
class GFG
{
static class Node
{
int data;
Node left, right;
};
// insertion of Node in Tree
static Node getNode(int n)
{
Node root = new Node();
root.data = n;
root.left = null;
root.right = null;
return root;
}
// total sum of bst
static int sum(Node root)
{
if (root == null)
return 0;
return root.data + sum(root.left) +
sum(root.right);
}
// sum of all element except those
// which are adjecent to key Node
static int adjSum(Node root, int key)
{
int parent = root.data;
while (root != null)
{
if (key < root.data)
{
parent = root.data;
root = root.left;
}
else if (root.data == key) // key Node matches
{
// if the left Node and right Node of key is
// not null then add all adjecent Node and
// substract from totalSum
if (root.left != null && root.right != null)
return (parent + root.left.data +
root.right.data);
// if key is leaf
if (root.left == null && root.right == null)
return parent;
// If only left child is null
if (root.left == null)
return (parent + root.right.data);
// If only right child is null
if (root.right == null)
return (parent + root.left.data);
}
else
{
parent = root.data;
root = root.right;
}
}
return 0;
}
static int findTotalExceptKey(Node root, int key)
{
return sum(root) - adjSum(root, key);
}
// Driver code
public static void main(String[] args)
{
Node root = getNode(15);
root.left = getNode(13);
root.left.left = getNode(12);
root.left.left.left = getNode(11);
root.left.right = getNode(14);
root.right = getNode(20);
root.right.left = getNode(18);
root.right.right = getNode(24);
root.right.right.left = getNode(23);
root.right.right.right = getNode(25);
int key = 20;
System.out.printf("%d ",
findTotalExceptKey(root, key));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program to find total sum
# except a given Node in BST
class getNode:
def __init__(self, n):
self.data = n
self.left = None
self.right = None
# Total sum of bst
def sum(root):
if (root == None):
return 0
return (root.data + sum(root.left) +
sum(root.right))
# Sum of all element except those
# which are adjecent to key Node
def adjSum(root, key):
parent = root.data
while (root != None):
if (key < root.data):
parent = root.data
root = root.left
elif (root.data == key):
# Key Node matches
# if the left Node and right Node of key is
# not None then add all adjecent Node and
# substract from totalSum
if (root.left != None and
root.right != None):
return (parent + root.left.data +
root.right.data)
# If key is leaf
if (root.left == None and
root.right == None):
return parent
# If only left child is None
if (root.left == None):
return (parent + root.right.data)
# If only right child is None
if (root.right == None):
return (parent + root.left.data)
else:
parent = root.data
root = root.right
return 0
def findTotalExceptKey(root, key):
return sum(root) - adjSum(root, key)
# Driver code
if __name__ == '__main__':
root = getNode(15)
root.left = getNode(13)
root.left.left = getNode(12)
root.left.left.left = getNode(11)
root.left.right = getNode(14)
root.right = getNode(20)
root.right.left = getNode(18)
root.right.right = getNode(24)
root.right.right.left = getNode(23)
root.right.right.right = getNode(25)
key = 20
print(findTotalExceptKey(root, key))
# This code is contributed by bgangwar59
C#
// C# program to find total sum
// except a given Node in BST
using System;
class GFG
{
class Node
{
public int data;
public Node left, right;
};
// insertion of Node in Tree
static Node getNode(int n)
{
Node root = new Node();
root.data = n;
root.left = null;
root.right = null;
return root;
}
// total sum of bst
static int sum(Node root)
{
if (root == null)
return 0;
return root.data + sum(root.left) +
sum(root.right);
}
// sum of all element except those
// which are adjecent to key Node
static int adjSum(Node root, int key)
{
int parent = root.data;
while (root != null)
{
if (key < root.data)
{
parent = root.data;
root = root.left;
}
else if (root.data == key) // key Node matches
{
// if the left Node and right Node of key is
// not null then add all adjecent Node and
// substract from totalSum
if (root.left != null && root.right != null)
return (parent + root.left.data +
root.right.data);
// if key is leaf
if (root.left == null && root.right == null)
return parent;
// If only left child is null
if (root.left == null)
return (parent + root.right.data);
// If only right child is null
if (root.right == null)
return (parent + root.left.data);
}
else
{
parent = root.data;
root = root.right;
}
}
return 0;
}
static int findTotalExceptKey(Node root, int key)
{
return sum(root) - adjSum(root, key);
}
// Driver code
public static void Main(String[] args)
{
Node root = getNode(15);
root.left = getNode(13);
root.left.left = getNode(12);
root.left.left.left = getNode(11);
root.left.right = getNode(14);
root.right = getNode(20);
root.right.left = getNode(18);
root.right.right = getNode(24);
root.right.right.left = getNode(23);
root.right.right.right = getNode(25);
int key = 20;
Console.Write("{0} ",
findTotalExceptKey(root, key));
}
}
// This code is contributed by PrinciRaj1992
输出:
118
时间复杂度:O(n)+ O(h)其中,n是BST中的节点数,h是BST的高度。我们可以将时间复杂度写为O(n)。