节点的结构如下。
struct node
{
int data;
int noofchilds;
node *child[n];
node *parent;
};
我很欣赏递归和非递归方法。
非递归版本:
struct node {
struct node *parent;
unsigned nchild;
struct node *child[XXX];
int data;
};
void deltree(struct node *np)
{
struct node *par;
while (np) {
/* if this node has any children, start by
** "descending" to the highest numbered child and kill that first.
*/
if (np->nchild--) {
np = np->child[np->nchild];
continue;
}
/* when we arrive here, *np has no more children left,
** so kill it, and step up to its parent
*/
par = node->parent;
// if np->child was obtained via malloc() uncomment next line
// free (np->child);
free (np);
np = par;
}
return;
}
移除节点并递归移除其子节点。
如果必须删除完整的树(正如您的问题所示),则父指针无关紧要(并且会随着节点本身的删除而删除)。
一种迭代算法:
Start at the parent node.
Then do the following actions as long as possible:
if the current node has one or more children:
set one of the children nodes as the (next) current node
else
delete the current node and use its parent as the (next) current node.
if the current node was the root node (which has no parent), stop.
希望它能有所帮助。
// Program to delete all the nodes of a n-Ary tree ~ coded by Hiren
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// Tree template
struct Node {
int val;
vector<Node*> children;
// Init constructor
Node(int val) {
this->val = val;
};
};
// Method to print the tree using preOrder traversal
void printTree(Node* root) {
if(root) {
cout<<root->val<<' ';
for(auto childNode : root->children) {
printTree(childNode);
}
}
}
// #1 Method to delete all the nodes of the n-Ary tree using bfs - O(N) & O(M) : Where M is the maximum number of nodes at any level
void deleteAllNodes(Node*& root) {
// Edge case: When the tree is empty
if(!root)
return;
queue<Node*> q;
q.push(root);
while(!q.empty()) {
// Take the front node of the queue
root = q.front(); q.pop();
// Store all its childrens to the queue
for(auto childNode : root->children) {
q.push(childNode);
}
// Ensurely set the node to nullptr and than delete it else a segmentation fault can occur
root = nullptr;
delete root;
}
}
// #2 Method to delete all the nodes of the n-Ary tree using dfs - O(N) & O(H) : Where H let be the maximum height of the tree
void deleteAllNodes_(Node*& root) {
// Edge case: When the tree is empty
if(!root)
return;
// Visit each of the children one by one
for(auto childNode : root->children) {
deleteAllNodes_(childNode);
}
// Ensurely set the node to nullptr and than delete it else a segmentation fault can occur
root = nullptr;
delete root;
}
// Driver code
int main() {
// Creating tree, connecting nodes and initializing their data
Node* root = new Node(3);
root->children.push_back(new Node(5));
root->children.push_back(new Node(1));
root->children[0]->children.push_back(new Node(6));
root->children[0]->children.push_back(new Node(2));
root->children[0]->children[0]->children.push_back(new Node(10));
root->children[0]->children[0]->children.push_back(new Node(11));
root->children[0]->children[0]->children.push_back(new Node(12));
root->children[0]->children[1]->children.push_back(new Node(7));
root->children[0]->children[1]->children.push_back(new Node(4));
// Print call
printTree(root); cout<<'n';
// Deletion call
deleteAllNodes_(root);
return 0;
}
// Link: https://stackoverflow.com/questions/9414290/how-to-delete-a-nary-tree-each-node-has-a-parent-pointer-too-in-it