HDU 1671 Phone List(辞書ツリーを削除する必要があります.そうしないとMemory Limit Exceeded)


簡単な辞書ツリーの問題ですが、この問題には複数のテスト例があるので、作成されるたびに辞書ツリーが削除され、最初は削除されず、メモリが8 MBを超えています.
delete操作を追加するとメモリ使用量が39 MBから3320 Kに減少しました
削除するのは再帰で、Discussの中の方法を参考にするので、前に自分で再帰で书くのではありませんて、とても面倒で、効果もよくなくて、ここでコードの学友を分かち合うことにお礼を言いました
次はACのコードです.
// hdu1671
#include <stdio.h>
#include <string.h>

struct node{
	bool is_over;
	node * child[10];
	int child_num;
	node(){
		is_over = false;
		child_num = 0;
		memset(child, 0, sizeof(child));
	}
};

bool add(char * str, node * next)
{	
	bool mark = false;
	while(*str)
	{
		if(next->child[*str-'0'] == NULL)
		{
			next->child[*str-'0'] = new node();
			next->child_num++;
			mark = true;
		}
		next = next->child[*str-'0'];
		if(next->is_over)
			return false;
		str++;
	}
	next->is_over = true;
	if(mark == false)
		return false;
	return true;	
}

void delete_tree(node * root)
{
	// 
	for(int i=0; i<10; i++)
		if(root->child[i] != NULL)
			delete_tree(root->child[i]);
	delete root;
}
int main(void)
{
	//freopen("E:\\input.txt", "r", stdin);
	int n;
	char str[13];
	scanf("%d", &n);
	while(scanf("%d", &n) != EOF)
	{
		node * root = new node();
		int i;
		for(i=0; i<n; i++)
		{
			scanf("%s", str);
			if(add(str, root) == false)
			{
				puts("NO");					
				break;
			}
		}
		if(i < n-1)
		{
			i = n-1-i;
			while(i--) scanf("%s", str);
		}			
		else if(i == n)
			puts("YES");

		delete_tree(root);
	}
	return 0;
}