У меня есть, например, дерево правого брата левого ребенка:
Если, например, я хочу сделать E (включая его дочерние узлы E, K, L , P, Q) дочерний узел H. Таким образом, H будет содержать N, O, E (и его дочерние элементы). Я намереваюсь добавить дочерние элементы в родительский узел, затем удалить старые узлы, но затем появятся новые пары родительские-дочерние элементы. Какой кратчайший путь для этого?
Вот код для воспроизведения:
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
struct Node
{
string data;
struct Node *next;
struct Node *child;
};
// Creating new Node
Node* newNode(string data)
{
Node *newNode = new Node;
newNode->next = newNode->child = NULL;
newNode->data = data;
return newNode;
}
// Adds a sibling to a list with starting with n
Node *addSibling(Node *n, string data)
{
if (n == NULL)
return NULL;
while (n->next)
n = n->next;
return (n->next = newNode(data));
}
// Add child Node to a Node
Node *addChild(Node * n, string data)
{
if (n == NULL)
return NULL;
// Check if child list is not empty.
if (n->child)
return addSibling(n->child, data);
else
return (n->child = newNode(data));
}
// Traverses tree in level order
void traverseTree(Node * root)
{
if (root == NULL)
return;
while (root)
{
cout << " " << root->data;
if (root->child)
traverseTree(root->child);
root = root->next;
}
}
//Driver code
int main()
{
Node *root = newNode("A");
Node *nB = addChild(root, "B");
Node *nC = addChild(root, "C");
Node *nD = addChild(root, "D");
Node *nE = addChild(root, "E");
Node *nF = addChild(root, "F");
Node *nG = addChild(root, "G");
Node *nH = addChild(nB, "H");
Node *nI = addChild(nB, "I");
Node *nJ = addChild(nB, "J");
Node *nK = addChild(nE, "K");
Node *nL = addChild(nE, "L");
Node *nM = addChild(nG, "M");
Node *nN = addChild(nH, "N");
Node *nO = addChild(nH, "O");
Node *nP = addChild(nK, "P");
Node *nQ = addChild(nL, "Q");
traverseTree(root);
return 0;
}