資料結構 樹的實現(C語言)

2021-08-17 06:18:07 字數 3282 閱讀 2053

1、樹的概念

樹形結構是節點之間以及分支關係定義的層次結構。作為一種重要的非線性結構,樹形結構中乙個節點最多只有乙個前驅節點,但是可以有多個後繼節點。

2、樹的儲存結構

在計算機中,樹有多種的儲存方式,下面介紹一種動態的「左子/右兄」二叉鍊錶表示方法。

#include "mytree.h"

#include using namespace std;

#define ok (0)

#define error (-1)

#define max_name_len (50) //最大的名字長度

/*樹結構體中資料成員*/

typedef struct _elementtype

elementtype;

/*樹節點結構體*/

typedef struct _treenode

treenode;

/*樹結構體*/

typedef struct _ctree

ctree;

/*全域性資料儲存樹資訊*/

ctree g_tree;

/** 功能:檢測結點的index是否正確

* 入參:要檢測的結點index

* 返回值:合法index返回true,不合法的index返回false

*/static bool mytree_check_node_index(const int index)

} return false;}/*

* 功能:獲取指定的結點指標

* 入參:父節點,比較引數index,出參nodeinfo

* 返回值:na

*/void mytree_preorder_get_node(treenode *tree, int index, treenode *nodeinfo)

mytree_preorder_get_node(tree->firstchild, index, nodeinfo);

mytree_preorder_get_node(tree->nextsibing, index, nodeinfo); }

return ;}/*

* 功能:通過結點的index獲取結點的指標資訊

* 入參:查詢結點的index

* 返回值:成功返回指向結點的指標,不成功返回null

*/treenode *mytree_get_node_by_index(const int index)

root = g_tree.root;

//遍歷當前的樹,返回指定結點的指標

mytree_preorder_get_node(root, index, tmpnode);

return tmpnode;}/*

* 功能:設定乙個孩子到樹中

* 入參:parentindex: 父節點的index

element :孩子結點的資訊

* 返回值:插入成功返回0, 失敗返回-1

*/int mytree_set_child(int parentindex, int index, elementtype element)

parentnode = mytree_get_node_by_index(parentindex);

if (null == parentnode)

//lastchild = mytree_get_last_child(parentnode);

newnode = (treenode *)malloc(sizeof(treenode));

if(null == newnode)

memset(newnode, 0, sizeof(treenode));

newnode->index = index;

newnode->element.id = element.id;

memcpy(newnode->element.name, element.name, max_name_len);

g_tree.nodeindexs.push_back(index);

g_tree.num++;

if (null == parentnode->firstchild)

if(null == parentnode->nextsibing)

head = parentnode->nextsibing;

while(head)

lastchild->nextsibing = newnode;

return ok;}/*

* 功能:設定乙個樹的根節點

* 入參: element :根結點的資訊

* 返回值:插入成功返回0, 失敗返回-1

*/int mytree_set_root( elementtype element)

memset(newnode, 0, sizeof(treenode));

newnode->index = 0;//根節點index

newnode->firstchild = null;

newnode->nextsibing = null;

newnode->element.id = element.id;

memcpy(newnode->element.name, element.name, max_name_len);

g_tree.nodeindexs.push_back(0);

g_tree.num++;

g_tree.root = newnode;

return ok;}/*

* 功能:初始化當前樹

* 入參:無

* 返回值:無

*/void mytree_init()

/** 功能:獲取指定的結點指標

* 入參:父節點,比較引數index,出參nodeinfo

* 返回值:na

*/void mytree_preorder_visit(treenode *tree)

return ;}/*

* 功能:列印整個樹的結點

* 入參:父節點,比較引數index,出參nodeinfo

* 返回值:na

*/void mytree_dump()

/** 功能:建立一棵樹

* 入參:無

* 返回值:無

*/void mytree_create()

/** 功能:測試當前樹結構

* 入參:無

* 返回值:無

*/void tree_test()

資料結構(C語言)樹的儲存結構

1 雙親表示法 實現 定義結構陣列,存放樹的結點,每個結點包含兩個域 資料域 存放結點本身資訊 雙親域 指示本結點的雙親結點在陣列中的位置 陣列下標 data parent0r 11a0 2b03 c04d 15e1 6f37 h68h 69k6 特點 找雙親容易,找孩子難 實現 typedef s...

資料結構 樹 C語言 堆

include include typedef struct heapstruct pheap pheap為結構指標,指向這個結構 struct heapstruct typedef pheap maxheap typedef pheap minheap define maxdata 1000 de...

資料結構 C語言 之樹

所謂二叉樹就是只具有0,1,2三種度的一顆樹 前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。若二叉樹為空則結束返回,否則 1 訪問根結點。2 前序遍歷左子樹。3 前序遍歷右子樹 需要注意的是 遍歷左右子樹時仍然採用前序遍歷...