📜  将给定的二叉树转换为具有逻辑与属性的树

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

将给定的二叉树转换为具有逻辑与属性的树

给定一棵二叉树(每个节点最多有 2 个子节点),其中每个节点的值为 0 或 1。将给定的二叉树转换为具有逻辑与属性的树,即每个节点值应该是其子节点之间的逻辑与.

例子:

Input : The below tree doesn’t hold the logical AND property
        convert it to a tree that holds the property.
             1
           /   \
          1     0
         / \   / \
        0   1 1   1 
Output :
             0
           /   \
          0     1
         / \   / \
        0   1 1   1 

这个想法是以后序方式遍历给定的二叉树。对于每个节点检查(递归地)该节点是否有一个子节点,那么我们不需要检查节点是否有两个子节点,然后只需使用其子数据的逻辑与来更新节点数据。

C++
// C++ code to convert a given binary tree
// to a tree that holds logical AND property.
#include
using namespace std;
 
// Structure of binary tree
struct Node
{
    int data;
    struct Node* left;
    struct Node* right;
};
 
// function to create a new node
struct Node* newNode(int key)
{
    struct Node* node = new Node;
    node->data= key;
    node->left = node->right = NULL;
    return node;
}
 
// Convert the given tree to a tree where
// each node is logical AND of its children
// The main idea is to do Postorder traversal
void convertTree(Node *root)
{
    if (root == NULL)
        return;
 
    /* first recur on left child */
    convertTree(root->left);
 
    /* then recur on right child */
    convertTree(root->right);
 
    if (root->left != NULL && root->right != NULL)
        root->data = (root->left->data) &
                     (root->right->data);
}
 
void printInorder(Node* root)
{
    if (root == NULL)
        return;
 
    /* first recur on left child */
    printInorder(root->left);
 
    /* then print the data of node */
    printf("%d ", root->data);
 
    /* now recur on right child */
    printInorder(root->right);
}
 
// main function
int main()
{
    /* Create following Binary Tree
             1
           /   \
          1     0
         / \   / \
        0   1 1   1
             */
 
    Node *root=newNode(0);
    root->left=newNode(1);
    root->right=newNode(0);
    root->left->left=newNode(0);
    root->left->right=newNode(1);
    root->right->left=newNode(1);
    root->right->right=newNode(1);
    printf("\n Inorder traversal before conversion ");
    printInorder(root);
 
    convertTree(root);
 
    printf("\n Inorder traversal after conversion ");
    printInorder(root);
    return 0;
}


Java
// Java code to convert a given binary tree
// to a tree that holds logical AND property.
class GfG {
 
// Structure of binary tree
static class Node
{
    int data;
     Node left;
     Node right;
}
 
// function to create a new node
static Node newNode(int key)
{
    Node node = new Node();
    node.data= key;
    node.left = null;
    node.right = null;
    return node;
}
 
// Convert the given tree to a tree where
// each node is logical AND of its children
// The main idea is to do Postorder traversal
static void convertTree(Node root)
{
    if (root == null)
        return;
 
    /* first recur on left child */
    convertTree(root.left);
 
    /* then recur on right child */
    convertTree(root.right);
 
    if (root.left != null && root.right != null)
        root.data = (root.left.data) & (root.right.data);
}
 
static void printInorder(Node root)
{
    if (root == null)
        return;
 
    /* first recur on left child */
    printInorder(root.left);
 
    /* then print the data of node */
    System.out.print(root.data + " ");
 
    /* now recur on right child */
    printInorder(root.right);
}
 
// main function
public static void main(String[] args)
{
    /* Create following Binary Tree
            1
        / \
        1     0
        / \ / \
        0 1 1 1
            */
 
    Node root=newNode(0);
    root.left=newNode(1);
    root.right=newNode(0);
    root.left.left=newNode(0);
    root.left.right=newNode(1);
    root.right.left=newNode(1);
    root.right.right=newNode(1);
    System.out.print("Inorder traversal before conversion ");
    printInorder(root);
 
    convertTree(root);
    System.out.println();
    System.out.print("Inorder traversal after conversion ");
    printInorder(root);
}}


Python3
# Program to convert an aribitary binary tree
# to a tree that holds children sum property
 
# Helper function that allocates a new
# node with the given data and None
# left and right pointers.                                    
class newNode:
 
    # Construct to create a new node
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# Convert the given tree to a tree where
# each node is logical AND of its children
# The main idea is to do Postorder traversal
def convertTree(root) :
 
    if (root == None) :
        return
 
    """ first recur on left child """
    convertTree(root.left)
 
    """ then recur on right child """
    convertTree(root.right)
 
    if (root.left != None and root.right != None):
        root.data = ((root.left.data) &
                     (root.right.data))
 
def printInorder(root) :
 
    if (root == None) :
        return
 
    """ first recur on left child """
    printInorder(root.left)
 
    """ then print the data of node """
    print( root.data, end = " ")
 
    """ now recur on right child """
    printInorder(root.right)
 
# Driver Code
if __name__ == '__main__':
     
    """ Create following Binary Tree
            1
        / \
        1     0
        / \ / \
        0 1 1 1
            """
 
    root = newNode(0)
    root.left = newNode(1)
    root.right = newNode(0)
    root.left.left = newNode(0)
    root.left.right = newNode(1)
    root.right.left = newNode(1)
    root.right.right = newNode(1)
 
    print("Inorder traversal before conversion",
                                      end = " ")
    printInorder(root)
 
    convertTree(root)
 
    print("\nInorder traversal after conversion ",
                                        end = " ")
    printInorder(root)
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)


C#
// C# code to convert a given binary tree
// to a tree that holds logical AND property.
using System;
 
class GfG
{
 
// Structure of binary tree
class Node
{
    public int data;
    public Node left;
    public Node right;
}
 
// function to create a new node
static Node newNode(int key)
{
    Node node = new Node();
    node.data= key;
    node.left = null;
    node.right = null;
    return node;
}
 
// Convert the given tree to a tree where
// each node is logical AND of its children
// The main idea is to do Postorder traversal
static void convertTree(Node root)
{
    if (root == null)
        return;
 
    /* first recur on left child */
    convertTree(root.left);
 
    /* then recur on right child */
    convertTree(root.right);
 
    if (root.left != null && root.right != null)
        root.data = (root.left.data) & (root.right.data);
}
 
static void printInorder(Node root)
{
    if (root == null)
        return;
 
    /* first recur on left child */
    printInorder(root.left);
 
    /* then print the data of node */
    Console.Write(root.data + " ");
 
    /* now recur on right child */
    printInorder(root.right);
}
 
// Driver code
public static void Main()
{
    /* Create following Binary Tree
            1
        / \
        1 0
        / \ / \
        0 1 1 1
            */
 
    Node root=newNode(0);
    root.left=newNode(1);
    root.right=newNode(0);
    root.left.left=newNode(0);
    root.left.right=newNode(1);
    root.right.left=newNode(1);
    root.right.right=newNode(1);
    Console.Write("Inorder traversal before conversion ");
    printInorder(root);
 
    convertTree(root);
    Console.WriteLine();
    Console.Write("Inorder traversal after conversion ");
    printInorder(root);
}
}
 
/* This code is contributed by Rajput-Ji*/


Javascript


输出:

Inorder traversal before conversion 0 1 1 0 1 0 1 
 Inorder traversal after conversion 0 0 1 0 1 1 1