📌  相关文章
📜  除BST中给定节点的相邻节点外的总和

📅  最后修改于: 2021-05-24 22:53:08             🧑  作者: Mango

给定一个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)。