关于树的内存释放有关问题,方法都试过了,老是死掉,哪位高手来帮小弟我看看

关于树的内存释放问题,方法都试过了,老是死掉,谁来帮我看看啊
我就不bb了,直接代码,就是后面的节点释放有问题,本来是语法分析的节点树,我简化成一棵小树了,所有的次序都试过了,先儿子(左右节点交换)后指针(指针顺序、逆序),先指针后儿子(左右节点交换)都不行,实在没办法了,老是在第二个free出错,谁帮我看看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
char* id;
char* name;
char* value;
struct Node* lchild;
struct Node* rchild;
}Node;

Node* Init();
Node* CreateNode();
void Free(Node* root);

int main()
{
Node* root;
root = Init();

root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
strcpy(root->lchild->id, "lid");
root->lchild->name = (char*)malloc(sizeof(strlen("lname"))+1);
strcpy(root->lchild->name, "lname");
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
strcpy(root->lchild->value, "lvalue");
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;


/*
//节点只有一部分指针分配内存
root->lchild = CreateNode();
root->lchild->id = (char*)malloc(sizeof(strlen("lid"))+1);
root->lchild->name = NULL; //(char*)malloc(sizeof(strlen("lname"))+1);
root->lchild->value = (char*)malloc(sizeof(strlen("lvalue"))+1);
root->lchild->lchild = NULL;
root->lchild->rchild = NULL;
*/

//按照释放顺序来分配右儿子节点内容
root->rchild = CreateNode();
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
strcpy(root->rchild->id, "rid");
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
strcpy(root->rchild->name, "rname");
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
strcpy(root->rchild->value, "rvalue");
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;

/*
//不按照释放的顺序来分配右儿子节点内存:
root->rchild = CreateNode();
root->rchild->name = (char*)malloc(sizeof(strlen("rname"))+1);
root->rchild->value = (char*)malloc(sizeof(strlen("rvalue"))+1);
root->rchild->id = (char*)malloc(sizeof(strlen("rid"))+1);
root->rchild->lchild = NULL;
root->rchild->rchild = NULL;
*/
Free(root);

return 0;
}

Node* CreateNode()
{
Node* temp = (Node*)malloc(sizeof(Node));
temp->id = NULL;
temp->name = NULL;