树(图)的建立、初始化和遍历

来源:互联网 发布:大连pm2.5历年数据 编辑:程序博客网 时间:2024/06/06 09:42
目前我理解的是有两种方法
自定义数据结构——节点,结构中包含下一个节点的指针,将节点与节点间串联起来。


以下是二叉查找树的建立和初始化方法

/**定义树形结构*/typedef struct Tree{    TREE_TYPE value;    struct Tree *left;    struct Tree *right;}Tree_node;/**根节点作为全局静态变量*/static Tree_node *root;/**初始化树*/void create_tree(){    root = NULL;}/**向树种插入数据*/Tree_node* insert(Tree_node *node,TREE_TYPE value){    if(node == NULL)    {        node = (Tree_node*)malloc(sizeof(Tree_node) * 1);        node-> value = value;        node -> left = NULL;        node -> right = NULL;        if(root == NULL) //如果为根节点            root = node;    }    else    {        if(value < node->value) //比该节点值小,写向左子树            node->left = insert(node->left,value);        else //比该节点值大,写向右子树            node->right = insert(node->right,value);    }    return node;}


如果是多叉树,或者是图(带环的树),

则自定义数据结构可以为:边(Edge),如果需要记录边的权值,则需要建立这样的一个struct (sicily 1024)

struct Edge{int to;  int length;Edge(int t, int l){to=t; length=l;}};

如果不需要记录边的权值,则可用vector<int> edges[101];表示,(sicily 1034)

每个节点的子节点用vector存储起来,edges【i】【j】表示第i个节点的第j个子节点。


DFS

void dfs(int start, int dist){int i,next,len;visited[start] = true;if(dist > result) result = dist;for(i=0; i<path[start].size(); i++){next = path[start][i].to;len = path[start][i].length;if(!visited[path[start][i].to])dfs(next, dist+len);}}



0 0
原创粉丝点击