//头函数
#ifndef __1TREE_H__
#define __1TREE_H__
#define FLASE 0
#define TRUE 1
struct _treenode;
typedef struct _childnode
{
struct _treenode *parentnode;
struct _childnode *childnext;
}ChildNode;
typedef struct _treenode
{
char data;
struct _treenode *parent;
struct _childnode *childnode;
struct _treenode *treenext;
int degree;
}TreeNode;
typedef struct _tree
{
struct _treenode *head;
int len;
}Tree;
//创建树
Tree *creat_tree();
//插入结点
int Insert_tree(Tree *tree, char data, int pos);
//打印数据
void Display(Tree *tree);
//获取树中指定的数据
int Tree_Get(Tree* tree, int pos, char *x);
//清空树
int Tree_Clear(Tree* tree);
//销毁树
void Tree_Destroy(Tree* tree);
//判断树是否为空
TreeNode* Tree_Root(Tree* tree);
//树的结点个数
int Tree_Count(Tree* tree);
//树的高度
int Tree_Height(Tree* tree);
//树的度
int Tree_Degree(Tree* tree);
#endif //__1TREE_H__
//主要代码
#include "1tree.h"
#include <stdlib.h>
#include <stdio.h>
Tree *creat_tree()
{
Tree *tree = (Tree *)malloc(sizeof(Tree)/sizeof(char));
if(tree == NULL)
{
return NULL;
}
tree->len = 0;
tree->head = (TreeNode *)malloc(sizeof(TreeNode)/sizeof(char));
if(tree->head == NULL)
{
free(tree);
return NULL;
}
tree->head->parent = NULL;
tree->head->childnode = NULL;
tree->head->treenext = NULL;
tree->len = 0;
return tree;
}
int Insert_tree(Tree *tree, char data, int pos)
{
if(tree == NULL || pos < 0 || pos > tree->len)
{
return FALSE;
}
if(pos != 0 && tree->len == pos)
{
return FALSE;
}
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)/sizeof(char));
if(node == NULL)
{
return FALSE;
}
node->data = data;
node->treenext = NULL;
//建结点的孩子头结点
node->childnode = (ChildNode *)malloc(sizeof(ChildNode)/sizeof(char));
if(node->childnode == NULL)
{
free(node);
return FALSE;
}
node->childnode->parentnode = NULL;
node->childnode->childnext = NULL;
node->degree = 0;
//找父结点
int i;
TreeNode *parent = tree->head->treenext;
for(i = 0; i < pos; i++)
{
parent = parent->treenext;
}
node->parent = parent;
if(parent != NULL)
{
ChildNode *childnode = (ChildNode *)malloc(sizeof(ChildNode)/sizeof(char));
if(childnode == NULL)
{
free(node->childnode);
free(node);
return FALSE;
}
childnode->childnext = NULL;
childnode->parentnode = node;
ChildNode *tmp = parent->childnode;
while(tmp->childnext)
{
tmp = tmp->childnext;
}
tmp->childnext = childnode;
parent->degree ++;
}
TreeNode *tmp = tree->head;
while(tmp->treenext)
{
tmp = tmp->treenext;
}
tmp->treenext = node;
tree->len ++;
return TRUE;
}
void r_display(TreeNode *node, int gap)
{
if(node == NULL)
{
return;
}
int i;
for(i = 0;i < gap;i++)
{
printf("-");
}
printf("%c\n",node->data);
ChildNode *child = node->childnode->childnext;
while(child)
{
r_display(child->parentnode, gap + 4);
child = child->childnext;
}
}
void Display(Tree *tree)
{
if(tree == NULL)
{
return;
}
r_display(tree->head->treenext, 0);
}
void r_delete(Tree *tree, TreeNode *node)
{
if(tree == NULL || node == NULL)
{
return;
}
TreeNode *tmp = tree->head;
while(tmp->treenext)
{
if(tmp->treenext == node)
{
tmp->treenext = node->treenext;
tree->len --;
break;
}
tmp = tmp->treenext;
}
TreeNode *parent = node->parent;
if(parent != NULL)
{
ChildNode *tmp = parent->childnode;
while(tmp->childnext)
{
if(tmp->childnext->parentnode == node)
{
ChildNode *p = tmp->childnext;
tmp->childnext = p->childnext;
free(p);
parent->degree --;
break;
}
tmp = tmp->childnext;
}
}
ChildNode *child = node->childnode->childnext;
while(child)
{
ChildNode *pchild = child->childnext;
r_delete(tree,child->parentnode);
child = pchild;
}
free(node->childnode);
free(node);
}
int Delete(Tree *tree,int pos, char *x)
{
if(tree == NULL || pos < 0 || pos > tree->len)
{
return FALSE;
}
if(pos != 0 && tree->len == pos)
{
return FALSE;
}
int i;
TreeNode *current = tree->head->treenext;
for(i = 0;i < pos; i++)
{
current = current->treenext;
}
*x = current->data;
r_delete(tree,current);
return TRUE;
}
int Tree_Get(Tree* tree, int pos, char *x)
{
if(tree == NULL || pos < 0 || pos > tree->len)
{
return FALSE;
}
if(pos != 0 && pos == tree->len)
{
return FALSE;
}
TreeNode *node = tree->head->treenext;
int i;
for(i = 0; i < pos; i++)
{
node = node->treenext;
}
*x = node->data;
return TRUE;
}
int Tree_Clear(Tree* tree)
{
if(tree == NULL)
{
return FALSE;
}
char x;
Delete(tree,0,&x);
return TRUE;
}
void Tree_Destroy(Tree* tree)
{
if(tree == NULL)
{
return;
}
Tree_Clear(tree);
free(tree->head);
free(tree);
}
TreeNode *Tree_Root(Tree *tree)
{
if(tree == NULL)
{
return NULL;
}
return tree->head->treenext;
}
int Tree_Count(Tree* tree)
{
if(tree == NULL)
{
return FALSE;
}
return tree->len;
}
int r_height(TreeNode *node)
{
if(node == NULL)
{
return 0;
}
int subHeight = 0;
int max = 0;
ChildNode * child = node->childnode->childnext;
while(child)
{
subHeight = r_height(child->parentnode);
if(subHeight > max)
{
max = subHeight;
}
child = child->childnext;
}
return max + 1;
}
int Tree_Height(Tree* tree)
{
if(tree == NULL)
{
return FALSE;
}
int height = r_height(tree->head->treenext);
return height;
}
int r_degree(TreeNode *node)
{
if(node == NULL)
{
return FALSE;
}
int max = node->degree;
int subDegree = 0;
ChildNode *tmp = node->childnode->childnext;
while(tmp)
{
subDegree = r_degree(tmp->parentnode);
if(subDegree > max)
{
max = subDegree;
}
tmp = tmp->childnext;
}
return max;
}
int Tree_Degree(Tree* tree)
{
if(tree == NULL)
{
return FALSE;
}
TreeNode *node = tree->head->treenext;
int degree = r_degree(node);
return degree;
}
//主函数
#include "1tree.h"
int main()
{
Tree *tree = creat_tree();
Insert_tree(tree, 'A', 0);
Insert_tree(tree, 'B', 0);
Insert_tree(tree, 'C', 0);
Insert_tree(tree, 'D', 0);
Insert_tree(tree, 'E', 1);
Insert_tree(tree, 'F', 1);
Display(tree);
printf("树的高度:%d\n",Tree_Height(tree));
printf("树的度:%d\n", Tree_Degree(tree));
printf("树的结点:%d\n",Tree_Count (tree));
char x;
Delete(tree,0,&x);
printf("清除后:\n");
Display(tree);
return 0;
}