樹的建立與資料列印

2021-08-04 13:37:20 字數 2840 閱讀 6216

//標頭檔案 tree.h

#ifndef _tree_h_

#define _tree_h_

#define false 0

#define true 1

typedef _treenode;

typedef struct _childnode //孩子結點型鍊錶

childnode;

typedef char treedata; //樹結點型別

typedef struct _treenode

treenode;

typedef struct _tree

tree;

//定義乙個函式指標型別

typedef void (*treeprint)(treenode *node);

tree *create_tree();

//pos 要插入父結點

int insert_tree(tree *tree,treedata data,int pos);

void display (tree *tree,treeprint pfunc);

#endif //_tree_h_

//函式源** tree.c

#include "tree.h"

#include tree *create_tree()

//建立樹結點鍊錶的頭結點

tree->head = (treenode *)malloc(sizeof(treenode) / sizeof(char));

if(tree->head == null)

//給元素賦值

tree->head->parent = null;

tree->head->next = null;

tree->head->childlist = null;//置空,樹中沒有結點

tree->len = 0;

return tree;

}// pos 代表要插入結點父親結點的位置

int insert_tree(tree *tree,treedata data,int pos)

if(pos != 0 && tree->len == pos)

//新建結點

treenode *node = (treenode *)malloc(sizeof(treenode) / sizeof(char));

if(node == null)

node->data = data;

node->next = null;

//建立node結點的孩子結點鍊錶的頭結點

node->childlist = (childnode *)malloc(sizeof(childnode) / sizeof(char));

if(node->childlist == null)

node->childlist->next = null;

node->childlist->childnode = null;

node->degree = 0;

//找父結點

int i;

treenode *parent = tree->head->next; //樹結點的第乙個結點,根節點

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

node->parent = parent;

if(parent != null)

childnode->childnode = node;

childnode->next = null;

//把childnode加入到父結點node的孩子鍊錶中

childnode *tmp = parent->childlist;//孩子鍊錶的頭結點

while(tmp->next)

tmp = tmp->next;

tmp->next = childnode;

parent->degree += 1;//後繼(度)加一

}treenode *tmp = tree->head;//樹結點鍊錶的頭結點

while(tmp->next)

tmp = tmp->next;

tmp->next = node;

tree->len += 1;

return true; }

void r_display(treenode *node,int gap,treeprint pfunc) //遞迴列印結點

//列印結點自己

pfunc(node);

childnode *child = node->childlist->next;//該節點的第乙個孩子結點

//用遞迴列印結點孩子

while(child) }

void display(tree *tree,treeprint pfunc)//列印樹

//主函式 mani.c

#include #include "tree.h"

void printa(treenode *node)

int main()

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);

insert_tree(tree,'h',3);

insert_tree(tree,'i',3);

display(tree,printa);

return 0;

}

樹的遍歷與列印

樹的遍歷與列印 樹的遍歷有三種方法,先 中 後序遍歷。這三種方法都是以子樹的根節點作為參照系的,比如先序的意思就是把先列印根節點,中 後序以此類推。遍歷演算法的核心思想是遞迴,這不是偶然的,本質上是因為樹結構的定義就是 遞 歸 的。樹的定義 1 樹是有限點的集合 2 有且只有乙個根節點 3 集合中其...

廣義表的建立與列印

廣義表的建立與列印 本文取自 資料結構與演算法 c語言版 第三版 出版社是清華大學出版社。本博文作為學習資料整理。源 是vc 6.0上可執行程式,我挪到了vs2010中執行。在vs2010中新建c win32 控制台應用程式專案,建立結果截圖 1.廣義表的建立 廣義表的儲存結構示意圖 示例 c x,...

樹的遍歷與列印二

先中後序遍歷遞迴的性質造成遍歷時總是 貪婪 的,肯定會一條路走到底,再回溯,而層序遍歷並不需要我們這樣,層序遍歷需要我們 走走停停 所以層序遍歷肯定不能遞迴實現,那如何實現呢?以上圖為例,遍歷10,8,12沒有問題,它們分別是root,root.left,root.right。然後我們希望列印6,9...