데이터 구조의 유 니 버 설 트 리 (아이 형제 표현법)
8382 단어 데이터 구조
헤더 파일:
tree.h
#ifndef __TREE_H__
#define __TREE_H__
#include "error.h"
#define CHILD 1
#define BROTHER 0
typedef int TreeData;
//
typedef struct _treenode
{
TreeData data; //
struct _treenode *child; //
struct _treenode *brother; //
}TreeNode;
//
typedef struct _tree
{
int len; // ( )
TreeNode *head; //
}Tree;
//
//
Tree *Create_tree ();
// pos , 1, 0, 01 ,
//count , ( ) 。
// :
//
//flag
int Insert_Tree(Tree *tree, TreeData data, int pos, int count, int flag);
//
void Display(Tree *tree);
//
// pos , 1, 0, 01 ,
//count , ( ) 。
int Delete(Tree *tree, int pos, int count, TreeData *x);
//
// pos , 1, 0, 01 ,
//count , ( ) 。
int Tree_Get(Tree *tree, int pos, int count, TreeData *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 //__TREE_H__
원본 파일:
tree.c
#include "tree.h"
#include
#include
//
Tree *Create_tree ()
{
//
Tree *tree = (Tree*)malloc(sizeof(Tree)/sizeof(char));
if (tree == NULL)
{
errno = MALLOC_ERROR;
return NULL;
}
//
tree->head = (TreeNode *)malloc(sizeof(TreeNode)/sizeof(char));
if (tree->head == NULL)
{
errno = MALLOC_ERROR;
free(tree);
return NULL;
}
tree->head->child = NULL; // ,
tree->head->brother = NULL; //
tree->len = 0; // 0( )
return tree;
}
// pos , 1, 0, 01 ,
//count , ( ) 。
// :
//
//flag
int Insert_Tree(Tree *tree, TreeData data, int pos, int count, int flag)
{
if(tree == NULL || count < 0 || pos < 0 || flag != CHILD && flag != BROTHER)
{
errno = ERROR;
return FALSE;
}
//
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)/sizeof(char));
if (node == NULL)
{
errno = MALLOC_ERROR;
return FALSE;
}
// ,
node->data = data;
node->child = NULL;
node->brother = NULL;
if (count == 0) // 0,
{
tree->head->child = node;
tree->len++; // , +1
return TRUE;
}
else
{
// ,
TreeNode *tmp = tree->head;
int way;
while (count > 0 && tmp != NULL)
{
// ,
way = pos & 1;
pos = pos >> 1;
if (way == CHILD)
{
tmp = tmp->child;
}
else
{
tmp = tmp->brother;
}
count--;
}
//tmp ,tmp ,
if (tmp == NULL)
{
errno = OVER_ERROR;
printf ("
");
return FALSE;
}
// flag
if (flag == CHILD)
{
tmp->child = node;
}
else
{
tmp->brother = node;
}
tree->len++; // , +1
}
return TRUE;
}
//
void r_display(TreeNode *node,int gap)
{
if (node == NULL)
{
return;
}
//
int i;
for (i = 0; i < gap;i++)
{
printf ("-");
}
printf ("%c
",node->data); //
TreeNode * child = node->child; //
//
r_display (child,gap+4);
TreeNode * brother = node->brother; //
//
r_display (brother,gap);
}
//
void Display(Tree *tree)
{
if (tree == NULL)
{
errno = ERROR;
return;
}
r_display(tree->head->child,0);
}
//
void r_delete (Tree* tree,TreeNode* node)
{
// ,
if (node ==NULL || node->child == NULL && node->brother == NULL)
{
return;
}
TreeNode* p = node->child; //
r_delete(tree,p); //
if (p != NULL)
{
tree->len--; // , -1
}
free(p); //
p = node->brother; //
r_delete(tree,p); //
if (p != NULL)
{
tree->len--;
}
free(p); //
}
//
// pos , 1, 0, 01 ,
//count , ( ) 。
int Delete(Tree *tree, int pos, int count, TreeData *x)
{
//
if(tree == NULL || x == NULL || count <= 0 || pos <= 0)
{
errno = ERROR;
return FALSE;
}
// ,
if(tree->head->child == NULL)
{
errno = TREE_EMPTY;
printf ("
");
return FALSE;
}
//tmp , 。
TreeNode *tmp = tree->head;
int way;
while (count > 1 && tmp != NULL) //
{
way = pos & 1;
pos = pos >> 1;
if (way == CHILD)
{
tmp = tmp->child;
}
else
{
tmp = tmp->brother;
}
count--;
}
// tmp , ,
if (tmp == NULL)
{
errno = OVER_ERROR;
printf ("
");
return FALSE;
}
way = pos & 1; // , ,
if (way == CHILD)
{
if (tmp->child == NULL)
{
errno = OVER_ERROR;
printf ("
");
return FALSE;
}
}
else
{
if (tmp->brother == NULL)
{
errno = OVER_ERROR;
printf ("
");
return FALSE;
}
}
// ,
if (way == CHILD)
{
TreeNode* p = tmp->child;
*x = p->data;
tmp->child = p->brother; //
p->brother = NULL; //
r_delete(tree,p); //
free(p); //
tree->len--; // , -1
}
else
{
TreeNode* p = tmp->brother;
*x = p->data;
tmp->brother = p->brother;
p->brother = NULL;
r_delete(tree,p);
free(p);
tree->len--;
}
}
//
// pos , 1, 0, 01 ,
//count , ( ) 。
int Tree_Get(Tree *tree, int pos, int count, TreeData *x)
{
//
if(tree == NULL || x == NULL || count <= 0 || pos <= 0)
{
errno = ERROR;
return FALSE;
}
// ,
TreeNode *tmp = tree->head;
int way;
while (count > 0 && tmp != NULL)
{
way = pos & 1;
pos = pos >> 1;
if (way == CHILD)
{
tmp = tmp->child;
}
else
{
tmp = tmp->brother;
}
count--;
}
//tmp , ,
if (tmp == NULL)
{
errno = OVER_ERROR;
printf ("
");
return FALSE;
}
*x = tmp->data;
return TRUE;
}
//
int Tree_Clear(Tree* tree)
{
if (tree == NULL)
{
errno = ERROR;
return FALSE;
}
TreeData x;
return Delete(tree,1,1,&x); //
}
//
void Tree_Destroy(Tree* tree)
{
if (tree == NULL)
{
errno = ERROR;
return;
}
Tree_Clear(tree); //
free(tree->head); //
free(tree); //
}
//
TreeNode* Tree_Root(Tree* tree)
{
if (tree == NULL)
{
errno = ERROR;
return;
}
return tree->head->child;
}
//
int Tree_Count(Tree* tree)
{
if (tree == NULL)
{
errno = ERROR;
return;
}
return tree->len;
}
//
int r_height (TreeNode *node,int gap)
{
if (node == NULL)
{
return gap;
}
TreeNode * child = node->child; //
int ret = r_height (child,gap+1); // , +1,
TreeNode * brother = node->brother; //
r_height (brother,gap); //
return ret; //
}
//
int Tree_Height(Tree* tree)
{
if (tree == NULL)
{
return FALSE;
}
int ret = r_height (tree->head->child,0);
return ret;
}
//
int r_degree (TreeNode* node,int deg)
{
int i = 0;
if (node == NULL)
{
return deg;
}
TreeNode* p = node->child;
if (p != NULL) // , 1
{
i++;
}
int degtmp = r_degree(p,i); //
p = node->brother;
if (p != NULL) // , +1
{
deg++;
}
int tmpdeg = r_degree(p,deg); //
// ,
return (tmpdeg > degtmp ? tmpdeg : degtmp);
}
//
int Tree_Degree(Tree* tree)
{
if (tree == NULL || tree->head == NULL || tree->head->child == NULL)
{
return FALSE;
}
int deg = r_degree (tree->head->child,0);
return deg;
}
아이 형제 표현법 모형 으로 나무 와 더 많은 조작 을 실현 하 는 것 에 대해 서 는 모두 가 함께 실현 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.