📜  从两个给定的二叉树构造一个最大二叉树

📅  最后修改于: 2021-09-04 08:34:14             🧑  作者: Mango

给定两个二叉树,任务是从两个给定的二叉树中创建一个最大二叉树,并打印该树的中序遍历。

什么是最大的二叉树?

例子:

Input:
Tree 1                Tree 2
   3                    5 
  / \                  / \
 2   6                1   8 
/                      \   \ 
20                      2   8 
Output: 20 2 2 5 8 8
Explanation:
          5
         / \
        2   8
       / \   \
      20   2   8

To construct the required Binary Tree,
Root Node value: Max(3, 5) = 5
Root->left value: Max(2, 1) = 2
Root->right value: Max(6, 8) = 8
Root->left->left value: 20
Root->left->right value: 2
Root->right->right value: 8

Input:
       Tree 1            Tree 2 
         9                 5
        / \               / \
       2   6             1   8
      / \                 \   \
     20  3                 2   8
Output:  20 2 3 9 8 8
Explanation:
          9
         / \
        2   8
       / \   \
      20  3   8

方法:
请按照以下步骤解决问题:

  • 使用preorder traversal遍历两棵树。
  • 如果两个节点都是NULL ,则返回。否则,请检查以下条件:
    • 如果两个节点都不为NULL,则将它们之间的最大值存储为最大二叉树的节点值。
    • 如果只有一个节点为NULL ,则将非 NULL节点的值存储为最大二叉树的节点值。
  • 递归遍历左子树。
  • 递归遍历右子树
  • 最后,返回最大二叉树

下面是上述方法的实现:

C++
// C++ program to find the Maximum
// Binary Tree from two Binary Trees
#include
using namespace std;
  
// A binary tree node has data,
// pointer to left child
// and a pointer to right child
class Node{
     
public:
int data;
Node *left, *right;
   
Node(int data, Node *left,
               Node *right)
{
    this->data = data;
    this->left = left;
    this->right = right;
}
};
  
// Helper method that allocates
// a new node with the given data
// and NULL left and right pointers.
Node* newNode(int data)
{
    Node *tmp = new Node(data, NULL, NULL);
    return tmp;
}
  
// Given a binary tree, print
// its nodes in inorder
void inorder(Node *node)
{
    if (node == NULL)
        return;
  
    // First recur on left child
    inorder(node->left);
  
    // Then print the data of node
    cout << node->data << " ";
  
    // Now recur on right child
    inorder(node->right);
}
  
// Method to find the maximum
// binary tree from two binary trees
Node* MaximumBinaryTree(Node *t1, Node *t2)
{
    if (t1 == NULL)
        return t2;
    if (t2 == NULL)
        return t1;
  
    t1->data = max(t1->data, t2->data);
    t1->left = MaximumBinaryTree(t1->left,
                                 t2->left);
    t1->right = MaximumBinaryTree(t1->right,
                                  t2->right);
    return t1;
}
  
// Driver Code
int main()
{
     
    /* First Binary Tree
             3
            / \
           2   6
         /
        20
    */
  
    Node *root1 = newNode(3);
    root1->left = newNode(2);
    root1->right = newNode(6);
    root1->left->left = newNode(20);
  
    /* Second Binary Tree
            5
           / \
          1   8
           \   \
            2   8
            */
    Node *root2 = newNode(5);
    root2->left = newNode(1);
    root2->right = newNode(8);
    root2->left->right = newNode(2);
    root2->right->right = newNode(8);
  
    Node *root3 = MaximumBinaryTree(root1, root2);
    inorder(root3);
}
 
// This code is contributed by pratham76


Java
// Java program to find the Maximum
// Binary Tree from two Binary Trees
 
/* A binary tree node has data,
 pointer to left child
and a pointer to right child */
class Node {
    int data;
    Node left, right;
 
    public Node(int data, Node left,
                Node right)
    {
        this.data = data;
        this.left = left;
        this.right = right;
    }
 
    /* Helper method that allocates
       a new node with the given data
       and NULL left and right pointers. */
    static Node newNode(int data)
    {
        return new Node(data, null, null);
    }
 
    /* Given a binary tree, print
       its nodes in inorder*/
    static void inorder(Node node)
    {
        if (node == null)
            return;
 
        /* first recur on left child */
        inorder(node.left);
 
        /* then print the data of node */
        System.out.printf("%d ", node.data);
 
        /* now recur on right child */
        inorder(node.right);
    }
 
    /* Method to find the maximum
       binary tree from
       two binary trees*/
    static Node MaximumBinaryTree(Node t1, Node t2)
    {
        if (t1 == null)
            return t2;
        if (t2 == null)
            return t1;
        t1.data = Math.max(t1.data, t2.data);
        t1.left = MaximumBinaryTree(t1.left,
                                    t2.left);
        t1.right = MaximumBinaryTree(t1.right,
                                     t2.right);
        return t1;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        /* First Binary Tree
                 3
                / \
               2   6
              /
             20
        */
 
        Node root1 = newNode(3);
        root1.left = newNode(2);
        root1.right = newNode(6);
        root1.left.left = newNode(20);
 
        /* Second Binary Tree
                 5
                / \
                1  8
                \   \
                  2   8
                  */
        Node root2 = newNode(5);
        root2.left = newNode(1);
        root2.right = newNode(8);
        root2.left.right = newNode(2);
        root2.right.right = newNode(8);
 
        Node root3
            = MaximumBinaryTree(root1, root2);
        inorder(root3);
    }
}


Python3
# Python3 program to find the Maximum
# Binary Tree from two Binary Trees
  
''' A binary tree node has data,
 pointer to left child
and a pointer to right child '''
class Node:
     
    def __init__(self, data, left, right):
         
        self.data = data
        self.left = left
        self.right = right
    
''' Helper method that allocates
   a new node with the given data
   and None left and right pointers. '''
def newNode(data):
 
    return Node(data, None, None);
  
''' Given a binary tree, print
   its nodes in inorder'''
def inorder(node):
 
    if (node == None):
        return;
 
    ''' first recur on left child '''
    inorder(node.left);
 
    ''' then print the data of node '''
    print(node.data, end=' ');
 
    ''' now recur on right child '''
    inorder(node.right);
 
''' Method to find the maximum
   binary tree from
   two binary trees'''
def MaximumBinaryTree(t1, t2):
 
    if (t1 == None):
        return t2;
    if (t2 == None):
        return t1;
    t1.data = max(t1.data, t2.data);
    t1.left = MaximumBinaryTree(t1.left,
                                t2.left);
    t1.right = MaximumBinaryTree(t1.right,
                                 t2.right);
    return t1;
 
# Driver Code
if __name__=='__main__':
     
    ''' First Binary Tree
             3
            / \
           2   6
          /
         20
    '''
 
    root1 = newNode(3);
    root1.left = newNode(2);
    root1.right = newNode(6);
    root1.left.left = newNode(20);
 
    ''' Second Binary Tree
             5
            / \
            1  8
            \   \
              2   8
              '''
    root2 = newNode(5);
    root2.left = newNode(1);
    root2.right = newNode(8);
    root2.left.right = newNode(2);
    root2.right.right = newNode(8);
 
    root3 = MaximumBinaryTree(root1, root2);
    inorder(root3);
 
# This code is contributed by rutvik_56


C#
// C# program to find the Maximum
// Binary Tree from two Binary Trees
using System;
 
// A binary tree node has data,
// pointer to left child
// and a pointer to right child
class Node{
     
public int data;
public Node left, right;
 
public Node(int data, Node left,
                      Node right)
{
    this.data = data;
    this.left = left;
    this.right = right;
}
 
// Helper method that allocates
// a new node with the given data
// and NULL left and right pointers.
static Node newNode(int data)
{
    return new Node(data, null, null);
}
 
// Given a binary tree, print
// its nodes in inorder
static void inorder(Node node)
{
    if (node == null)
        return;
 
    // first recur on left child
    inorder(node.left);
 
    // then print the data of node
    Console.Write("{0} ", node.data);
 
    // now recur on right child
    inorder(node.right);
}
 
// Method to find the maximum
// binary tree from
// two binary trees
static Node MaximumBinaryTree(Node t1, Node t2)
{
    if (t1 == null)
        return t2;
    if (t2 == null)
        return t1;
 
    t1.data = Math.Max(t1.data, t2.data);
    t1.left = MaximumBinaryTree(t1.left,
                                t2.left);
    t1.right = MaximumBinaryTree(t1.right,
                                 t2.right);
    return t1;
}
 
// Driver Code
public static void Main(String[] args)
{
     
    /* First Binary Tree
             3
            / \
           2   6
         /
        20
    */
 
    Node root1 = newNode(3);
    root1.left = newNode(2);
    root1.right = newNode(6);
    root1.left.left = newNode(20);
 
    /* Second Binary Tree
            5
           / \
          1   8
           \   \
            2   8
            */
    Node root2 = newNode(5);
    root2.left = newNode(1);
    root2.right = newNode(8);
    root2.left.right = newNode(2);
    root2.right.right = newNode(8);
 
    Node root3 = MaximumBinaryTree(root1, root2);
    inorder(root3);
}
}
 
// This code is contributed by Amal Kumar Choubey


输出:
20 2 2 5 8 8

时间复杂度: O(N)
辅助空间: O(N)

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live