树的逻辑结构
树的逻辑结构表示有:树状表示法,文氏图表示法,凹入表示法和括号表示法。
树状表示法:
树是最基本的逻辑结构表示法,使用一棵树倒置表示,非常直观。
.文氏图标表示法:
使用集合以及集合包含关系描述树结构
凹入表示法:
使用线段的伸缩的关系描述树结构4.括号表示法:
孩子表示法
刚刚的双亲表示法,因为没有存储孩子结点的位置,所以找孩子结点比较麻烦,于是前辈们又想出来了另外一种方法,叫孩子表示法,这种方法融合了顺序存储与链式存储结构,可以很快的找到孩
#include<stdio.h> #include<stdlib.h> typedef struct LinkList { int data;//存放数据 struct LinkList* next; }Node; Node* node[10];//存储结点的数组 int size;//数组中元素的个数 int maxsize; void init(int);//初始化操作 void insert(int, int);//构建树 int find(int);//找到父节点 void init(int n) { size = 0; maxsize = 10; //其实生成一个new_node,然后再赋值给数组也行 node[size] = (Node*)malloc(sizeof(Node)); node[size]->data = n; node[size]->next = NULL;//根节点暂时没有孩子,next为空 size++; } int find(int p) { for (int i = 0; i < size; i++) { if (p == node[i]->data) return i; } return -1; } /*将数据n插入到结点p下面*/ //即将n作为p的孩子结点 void insert(int n, int p) { if (size == maxsize) { printf("已存满,插入失败\n"); } else { int i = find(p); if (i != -1) { //先将孩子结点放入到数组中 node[size] = (Node*)malloc(sizeof(Node)); node[size]->data = n; node[size]->next = NULL;//此结点暂时没有孩子结点 size++; //再将结点插入到父节点next中 Node* new_node = (Node*)malloc(sizeof(Node)); new_node->data = n; new_node->next = node[i]->next;//类似于头插法 node[i]->next = new_node;//将新插入的孩子结点放在父节点后一个位置,即父节点原有孩子结点的前面 } else printf("没有找到此父节点,插入失败\n"); } } int main() { init(1); insert(2, 1); insert(3, 1); insert(4, 1); insert(5, 2); insert(6, 2); insert(7, 3); for (int i = 0; i < size; i++) { printf("父节点为%d ", node[i]->data); Node* temp = node[i]->next; while (temp != NULL) { printf("孩子结点为%d ", temp->data); temp = temp->next; } printf("\n"); } }
子们。
3.孩子兄弟表示法
添加根节点1,其孩子、兄弟指针域为空;
添加结点2,其父节点为
typedef struct ChildSibling {
int data;//当前结点的数据
struct ChildSibling* child;//指向孩子的指针
struct ChildSibling* sibling;//指向兄弟的指针
}Node;
Node* get_node(Node* node, int parent)
{
if (node->data == parent)
{
return node;
}
if (node->child != NULL)
{
get_node(node->child, parent);
}
if (node->sibling != NULL)
{
get_node(node->sibling, parent);
}
return NULL;
}