📜  检查二叉树的覆盖和未覆盖节点的总和

📅  最后修改于: 2022-05-13 01:57:19.797000             🧑  作者: Mango

检查二叉树的覆盖和未覆盖节点的总和

给定一棵二叉树,您需要检查所有覆盖元素的总和是否等于所有未覆盖元素的总和。
在二叉树中,如果一个节点出现在左边界或右边界,则称为未覆盖。其余节点称为覆盖。

例如,考虑下面的二叉树

In above binary tree,
Covered node:     6, 5, 7
Uncovered node:   9, 4, 3, 17, 22, 20

The output for this tree should be false as 
sum of covered and uncovered node is not same

我们强烈建议您最小化您的浏览器并首先自己尝试。
为了计算未覆盖节点的总和,我们将遵循以下步骤:
1)从根开始,向左并继续前进,直到左孩子可用,如果没有,则转到右孩子,然后再次按照相同的过程,直到到达叶节点。

2)在第 1 步之后,左边界的总和将被存储,现在对于右部分再次执行相同的过程,但现在继续向右直到右孩子可用,如果没有,则转到左孩子并按照相同的过程直到你到达叶子节点。
在存储所有未覆盖节点的上述两步总和后,我们可以从总和中减去它,得到覆盖元素的总和,并检查二叉树的马。

C++
// C++ program to find sum of Covered and Uncovered node of
// binary tree
#include 
using namespace std;
 
/* A binary tree node has key, pointer to left
   child and a pointer to right child */
struct Node
{
    int key;
    struct Node* left, *right;
};
 
/* To create a newNode of tree and return pointer */
struct Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return (temp);
}
 
/* Utility function to calculate sum of all node of tree */
int sum(Node* t)
{
    if (t == NULL)
        return 0;
    return t->key + sum(t->left) + sum(t->right);
}
 
/* Recursive function to calculate sum of left boundary
   elements  */
int uncoveredSumLeft(Node* t)
{
    /*  If leaf node, then just return its key value   */
    if (t->left == NULL && t->right == NULL)
        return t->key;
 
    /*  If left is available then go left otherwise go right  */
    if (t->left != NULL)
        return t->key + uncoveredSumLeft(t->left);
    else
        return t->key + uncoveredSumLeft(t->right);
}
 
/* Recursive function to calculate sum of right boundary
   elements  */
int uncoveredSumRight(Node* t)
{
    /*  If leaf node, then just return its key value   */
    if (t->left == NULL && t->right == NULL)
        return t->key;
 
    /*  If right is available then go right otherwise go left  */
    if (t->right != NULL)
        return t->key + uncoveredSumRight(t->right);
    else
        return t->key + uncoveredSumRight(t->left);
}
 
// Returns sum of uncovered elements
int uncoverSum(Node* t)
{
    /* Initializing with 0 in case we don't have
       left or right boundary  */
    int lb = 0, rb = 0;
 
    if (t->left != NULL)
        lb = uncoveredSumLeft(t->left);
    if (t->right != NULL)
        rb = uncoveredSumRight(t->right);
 
    /* returning sum of root node, left boundary
       and right boundary*/
    return t->key + lb + rb;
}
 
// Returns true if sum of covered and uncovered elements
// is same.
bool isSumSame(Node *root)
{
    // Sum of uncovered elements
    int sumUC = uncoverSum(root);
 
    // Sum of all elements
    int sumT = sum(root);
 
    // Check if sum of covered and uncovered is same
    return (sumUC == (sumT - sumUC));
}
 
/* Helper function to print inorder traversal of
   binary tree   */
void inorder(Node* root)
{
    if (root)
    {
        inorder(root->left);
        printf("%d ", root->key);
        inorder(root->right);
    }
}
 
// Driver program to test above functions
int main()
{
    // Making above given diagram's binary tree
    Node* root = newNode(8);
    root->left = newNode(3);
 
    root->left->left = newNode(1);
    root->left->right = newNode(6);
    root->left->right->left = newNode(4);
    root->left->right->right = newNode(7);
 
    root->right = newNode(10);
    root->right->right = newNode(14);
    root->right->right->left = newNode(13);
 
    if (isSumSame(root))
        printf("Sum of covered and uncovered is same\n");
    else
        printf("Sum of covered and uncovered is not same\n");
}


Java
// Java program to find sum of covered and uncovered nodes
// of a binary tree
 
/* A binary tree node has key, pointer to left child and
   a pointer to right child */
class Node
{
    int key;
    Node left, right;
 
    public Node(int key)
    {
        this.key = key;
        left = right = null;
    }
}
 
class BinaryTree
{
    Node root;
 
    /* Utility function to calculate sum of all node of tree */
    int sum(Node t)
    {
        if (t == null)
            return 0;
        return t.key + sum(t.left) + sum(t.right);
    }
 
    /* Recursive function to calculate sum of left boundary
       elements  */
    int uncoveredSumLeft(Node t)
    {
        /*  If left node, then just return its key value   */
        if (t.left == null && t.right == null)
            return t.key;
 
        /*  If left is available then go left otherwise go right  */
        if (t.left != null)
            return t.key + uncoveredSumLeft(t.left);
         else
            return t.key + uncoveredSumLeft(t.right);
    }
 
    /* Recursive function to calculate sum of right boundary
       elements  */
    int uncoveredSumRight(Node t)
    {
        /*  If left node, then just return its key value   */
        if (t.left == null && t.right == null)
            return t.key;
 
        /*  If right is available then go right otherwise go left  */
        if (t.right != null)
            return t.key + uncoveredSumRight(t.right);
        else
            return t.key + uncoveredSumRight(t.left);
    }
 
    // Returns sum of uncovered elements
    int uncoverSum(Node t)
    {
        /* Initializing with 0 in case we don't have
           left or right boundary  */
        int lb = 0, rb = 0;
 
        if (t.left != null)
            lb = uncoveredSumLeft(t.left);
        if (t.right != null)
            rb = uncoveredSumRight(t.right);
 
        /* returning sum of root node, left boundary
           and right boundary*/
        return t.key + lb + rb;
    }
 
    // Returns true if sum of covered and uncovered elements
    // is same.
    boolean isSumSame(Node root)
    {
        // Sum of uncovered elements
        int sumUC = uncoverSum(root);
 
        // Sum of all elements
        int sumT = sum(root);
 
        // Check if sum of covered and uncovered is same
        return (sumUC == (sumT - sumUC));
    }
 
    /* Helper function to print inorder traversal of
       binary tree   */
    void inorder(Node root)
    {
        if (root != null)
        {
            inorder(root.left);
            System.out.print(root.key + " ");
            inorder(root.right);
        }
    }
 
    // Driver program to test above functions
    public static void main(String[] args)
    {
 
        BinaryTree tree = new BinaryTree();
 
        // Making above given diagram's binary tree
        tree.root = new Node(8);
        tree.root.left = new Node(3);
        tree.root.left.left = new Node(1);
        tree.root.left.right = new Node(6);
        tree.root.left.right.left = new Node(4);
        tree.root.left.right.right = new Node(7);
 
        tree.root.right = new Node(10);
        tree.root.right.right = new Node(14);
        tree.root.right.right.left = new Node(13);
 
        if (tree.isSumSame(tree.root))
            System.out.println("Sum of covered and uncovered is same");
         else
            System.out.println("Sum of covered and uncovered is not same");
    }
}
 
// This code has been contributed by Mayank Jaiswal(mayank_24)


Python3
# Python3 program to find sum of Covered and
# Uncovered node of binary tree
 
# To create a newNode of tree and return pointer
class newNode:
    def __init__(self, key):
        self.key = key
        self.left = self.right = None
 
# Utility function to calculate sum
# of all node of tree
def Sum(t):
    if (t == None):
        return 0
    return t.key + Sum(t.left) + Sum(t.right)
 
# Recursive function to calculate sum
# of left boundary elements
def uncoveredSumLeft(t):
     
    # If leaf node, then just return
    # its key value
    if (t.left == None and t.right == None):
        return t.key
 
    # If left is available then go
    # left otherwise go right
    if (t.left != None):
        return t.key + uncoveredSumLeft(t.left)
    else:
        return t.key + uncoveredSumLeft(t.right)
 
# Recursive function to calculate sum of
# right boundary elements
def uncoveredSumRight(t):
     
    # If leaf node, then just return
    # its key value
    if (t.left == None and t.right == None):
        return t.key
 
    # If right is available then go right
    # otherwise go left
    if (t.right != None):
        return t.key + uncoveredSumRight(t.right)
    else:
        return t.key + uncoveredSumRight(t.left)
 
# Returns sum of uncovered elements
def uncoverSum(t):
     
    # Initializing with 0 in case we
    # don't have left or right boundary
    lb = 0
    rb = 0
 
    if (t.left != None):
        lb = uncoveredSumLeft(t.left)
    if (t.right != None):
        rb = uncoveredSumRight(t.right)
 
    # returning sum of root node,
    # left boundary and right boundary
    return t.key + lb + rb
 
# Returns true if sum of covered and
# uncovered elements is same.
def isSumSame(root):
     
    # Sum of uncovered elements
    sumUC = uncoverSum(root)
 
    # Sum of all elements
    sumT = Sum(root)
 
    # Check if sum of covered and
    # uncovered is same
    return (sumUC == (sumT - sumUC))
 
# Helper function to print Inorder
# traversal of binary tree
def inorder(root):
    if (root):
        inorder(root.left)
        print(root.key, end = " ")
        inorder(root.right)
 
# Driver Code
if __name__ == '__main__':
     
    # Making above given diagram's
    # binary tree
    root = newNode(8)
    root.left = newNode(3)
 
    root.left.left = newNode(1)
    root.left.right = newNode(6)
    root.left.right.left = newNode(4)
    root.left.right.right = newNode(7)
 
    root.right = newNode(10)
    root.right.right = newNode(14)
    root.right.right.left = newNode(13)
 
    if (isSumSame(root)):
        print("Sum of covered and uncovered is same")
    else:
        print("Sum of covered and uncovered is not same")
         
# This code is contributed by PranchalK


C#
// C# program to find sum of covered
// and uncovered nodes of a binary tree
using System;
 
/* A binary tree node has key, pointer
to left child and a pointer to right child */
public class Node
{
    public int key;
    public Node left, right;
 
    public Node(int key)
    {
        this.key = key;
        left = right = null;
    }
}
 
class GFG
{
public Node root;
 
/* Utility function to calculate
sum of all node of tree */
public virtual int sum(Node t)
{
    if (t == null)
    {
        return 0;
    }
    return t.key + sum(t.left) +
                   sum(t.right);
}
 
/* Recursive function to calculate
sum of left boundary elements */
public virtual int uncoveredSumLeft(Node t)
{
    /* If left node, then just return
       its key value */
    if (t.left == null && t.right == null)
    {
        return t.key;
    }
 
    /* If left is available then go
       left otherwise go right */
    if (t.left != null)
    {
        return t.key + uncoveredSumLeft(t.left);
    }
    else
    {
        return t.key + uncoveredSumLeft(t.right);
    }
}
 
/* Recursive function to calculate
   sum of right boundary elements */
public virtual int uncoveredSumRight(Node t)
{
    /* If left node, then just return
       its key value */
    if (t.left == null && t.right == null)
    {
        return t.key;
    }
 
    /* If right is available then go
       right otherwise go left */
    if (t.right != null)
    {
        return t.key + uncoveredSumRight(t.right);
    }
    else
    {
        return t.key + uncoveredSumRight(t.left);
    }
}
 
// Returns sum of uncovered elements
public virtual int uncoverSum(Node t)
{
    /* Initializing with 0 in case we
    don't have left or right boundary */
    int lb = 0, rb = 0;
 
    if (t.left != null)
    {
        lb = uncoveredSumLeft(t.left);
    }
    if (t.right != null)
    {
        rb = uncoveredSumRight(t.right);
    }
 
    /* returning sum of root node,
    left boundary and right boundary*/
    return t.key + lb + rb;
}
 
// Returns true if sum of covered
// and uncovered elements is same.
public virtual bool isSumSame(Node root)
{
    // Sum of uncovered elements
    int sumUC = uncoverSum(root);
 
    // Sum of all elements
    int sumT = sum(root);
 
    // Check if sum of covered and
    // uncovered is same
    return (sumUC == (sumT - sumUC));
}
 
/* Helper function to print inorder
traversal of binary tree */
public virtual void inorder(Node root)
{
    if (root != null)
    {
        inorder(root.left);
        Console.Write(root.key + " ");
        inorder(root.right);
    }
}
 
// Driver Code
public static void Main(string[] args)
{
 
    GFG tree = new GFG();
 
    // Making above given diagram's binary tree
    tree.root = new Node(8);
    tree.root.left = new Node(3);
    tree.root.left.left = new Node(1);
    tree.root.left.right = new Node(6);
    tree.root.left.right.left = new Node(4);
    tree.root.left.right.right = new Node(7);
 
    tree.root.right = new Node(10);
    tree.root.right.right = new Node(14);
    tree.root.right.right.left = new Node(13);
 
    if (tree.isSumSame(tree.root))
    {
        Console.WriteLine("Sum of covered and " +
                            "uncovered is same");
    }
    else
    {
        Console.WriteLine("Sum of covered and " +
                        "uncovered is not same");
    }
}
}
 
// This code is contributed by Shrikant13


Javascript


输出 :

Sum of covered and uncovered is not same