我有两个二叉树。我想深入复制两个二叉树的结果而不更改输入树

时间:2019-12-17 01:20:13

标签: c++ data-structures stl

class Node{
public:
friend class BinaryTreeAdd;
Node(int value, Node* left, Node* right)
{
    this->value = value;
    this->left = left;
    this->right = right;
}
 int getValue() const
{
    return value;
}

Node* getLC() const
{
    return left;
}

Node* getRC() const
{
    return right;
}
void setValue(int value) {
    this->value = value;
}
void setLC(Node* left) {
    this->left = left;
}
void setRC(Node* right) {
    this->right = right;
}
 public:
   int value;
   Node* left;
   Node* right;
 };
class class BinaryTreeAdd {
 public:
static Node* cpNode(const Node* source)
{
    if (source == nullptr)
    {
        return nullptr;
    }
    return source == nullptr? nullptr
           : new Node(source->value,
            cpNode(source->left),
            cpNode(source->right));
}
 static Node* add(Node *t1, Node *t2){
    if (t1 == NULL) {
         return t2;
    }
    if (t2 == NULL) {
         return t1;
    } 
    t1->value += t2->value;
    t1->left=add(t1->left, t2->left);
    t1->right=add(t1->right, t2->right);
    return t1;
}
void display(Node * node){
    while (node != NULL) {
        cout << node->getValue() << endl;
            display(node->getLC());
            display(node->getRC());
        return;
    }
}
};
int main(){
BinaryTreeAdd bt;
Node root1(3, NULL, NULL);
Node root2(1, &root1, NULL);
Node root3(3, NULL, NULL);
Node root4(5, &root2, &root3);

Node root5(5, NULL, NULL);
Node root6(6, NULL, &root5);
Node root7(5, NULL, NULL);
Node root8(2, &root6, &root7);

Node *root9 = BinaryTreeAdd::add(&root4, &root8);
Node *root10 = BinaryTreeAdd::cpNode(root9);
bt.display(root10);
return 0;
}
  1. 我合并了两棵树t1和t2,并将结果存储回t1 (添加功能)。  函数调用:节点* root9 = BinaryTreeAdd :: add(&root4,&root8);
  2. 然后,我将t1深度复制到源代码(cpNode函数)。  函数调用:Node * root10 = BinaryTreeAdd :: cpNode(root9);
  3. 我已使用显示功能来打印深层副本的结果。  函数调用:bt.display(root10);

我的问题是:

  
      
  1. 如何使用cpNode函数将t1和t2的内容直接复制到源节点?

  2.   
  3. 合并树后,不应更改t1和t2的内容。

  4.   

1 个答案:

答案 0 :(得分:1)

这是您需要的功能。像输入函数一样,它是递归的。我用一个奇怪的选择简化了逻辑,即使一个节点为NULL,也允许递归。这使事情变得更容易,因为否则,在这种情况下,我需要单独的代码来复制输入节点。

// This function returns a newly-created
// node that merges the supplied input nodes
// per the requested algorithm.
// Either t1 or t2 or both can be NULL
static Node* add(Node *t1, Node *t2)
{

    // We don't want to create a new node if
    // both input nodes are NULL
    if (t1 == NULL) && (t2 == NULL)
        return NULL;

    return new Node (
          // The value is the sum of the input node
          // values or the input node value if just one
          (t1 ? t1->value : 0) + (t2 ? t2->value : 0),

          // The left node of the new node is the sum
          // of the input left nodes
          add (t1 ? t1->left : NULL, t2 ? t2->left : NULL),

          // The right node of the new node is the sum
          // of the input right nodes
          add (t1 ? t1->right : NULL, t2  ? t2->right : NULL));
}