樹和森林的孩子兄弟結構

2021-06-16 13:15:09 字數 1829 閱讀 8619

linux核心中多處用到孩子兄弟結構來組織一些相同型別的資料。如task_struct,dentry,vfs_mount等,結構圖如下:

實現原理很簡單,主要有三個字段:

parent:指向父結構的指標

children:子結構鍊錶的頭

sibling:將自己連線到父節點的子結構鍊錶中。

結構定義如下:

typedef struct _list list_t;

typedef struct _mutilist mutilist_t;

函式宣告:

void mutilist_addson (mutilist_t *node, int data);

mutilist_t* mutilist_getson (mutilist_t *node);

mutilist_t* mutilist_getparent (mutilist_t *node);

mutilist_t* mutilist_getbrother (mutilist_t *node);

#define get_ptr(_t,_m,_p) (_t*)((unsigned long)_p-((unsigned long)(&((_t*)0)->_m)))
函式實現:

#include "mutilist.h"

#include #include void mutilist_addson (mutilist_t *node, int data)

node->children.post = &son->sibling;

son->sibling.prev = &node->children;

son->children.prev = 0;

son->children.post = 0;

}mutilist_t* mutilist_getson (mutilist_t *node)

return get_ptr(mutilist_t,sibling,node->children.post);

}mutilist_t* mutilist_getparent (mutilist_t *node)

return node->parent;

}mutilist_t* mutilist_getbrother (mutilist_t *node)

return get_ptr(mutilist_t,sibling,node->sibling.post);

}void display (mutilist_t *node, int index)

for (i = 0; i < index; ++i)

printf ("%d\n",node->val);

if (node->children.post)

if (node->sibling.post)

}

測試:

int main (void)
輸出:

兄弟孩子變變變 二叉樹森林樹的轉換

樹轉換為二叉樹 兄弟變為子子孫孫個右孩子 1 加線。在所有兄弟結點之間加一條連線。2 去線。樹中的每個結點,只保留它與第乙個孩子結點的連線,刪除它與其它孩子結點之間的連線。3 層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第乙個孩子是結點的左孩子,兄弟轉換過來的孩子...

C語言實現實現樹和森林(孩子兄弟表示法)

因為樹和森林都可以與二叉樹相互轉化,所以採用二叉鍊錶的儲存方式表示樹和森林容易在計算機中實現 共有10個節點,則有11個空指標 fristchild指向該結點的第乙個孩子節點,nextsibling指向該結點的兄弟節點。雖然類似於二叉樹的左右孩子節點指標,但是功能不同 define elemtype...

樹的儲存結構 雙親表示法 孩子表示法 孩子兄弟法

實現 定義結構陣列存放樹的結點,每個結點包含兩個域 結點結構 結點型別定義 typedef struct ptnode ptnode 另外,用r儲存根結點的下標,用n表示結點個數 樹的雙親表示法示例 樹結構型別定義 define max tree size 100 typedef struct pt...