树的一般视图,不仅实现而且

许多人可能试图找到通用树的构造,但是搜索引擎只发现了二进制树。二进制搜索树,遍历二进制树和许多其他算法。
是的,的确如此,一般树不会在任何地方使用,旁路速度很慢,用例很小。

所以,我问了这个问题,现在我将解释如何构建树。 因此,理想情况下,一般形式的树的结构应存储三个变量:

  • 指向长子的指针
  • 指向兄弟的指针
  • 您将要存储的数据

struct Tnode { int key; struct Tnode *son; struct Tnode *brother; }; typedef struct Tnode Node; 

声明一个指向顶部的指针:

 Node *tree = NULL; 

我们必须事先同意如何输入顶点,这不是二叉树,每个顶点可以有任何子代。

  • + 2(或+ ssbb 2)-插入树中(对于一般树,路径由线指定,其中r是根,s是到长子的过渡,b是到兄弟的过渡);

我举一个例子:

 +r 1 + 2 + 3 + 3 +s 5 +sb 6 +sb 7 

结果,该树将被释放:

 1 2 5 3 6 7 3 

首先,创建一个添加顶点的函数,即为该顶点分配内存并传递指向该顶点的指针(最初与任何东西都不相关)。

 Node *create_tree(int v) { Node *Tree = (Node *) malloc(sizeof(Node)); Tree->key = v; //     ,  ,   value Tree->son = NULL; Tree->brother = NULL; return Tree; } 

您还必须创建一个处理路径字符串(+ bs ...)的函数。 每次我们从根开始遍历时,如果未创建遍历,则打印NULL(我们什么也不能做)。 如果没有峰值,那么我们必须创建它。 转到创建树函数并获得指向根的指针。

注意:Node **树通过结构,而不是副本。 与Node * tree声明不同,这使我们能够更改无法完成的操作。

通常,我们应该找到指向顶部的指针,我们需要在上面添加一个儿子:

 Node* add_node(Node **tree, const char *a) { Node* t = *tree; int value; scanf("%d", &value); int i = 0; while (a[++i] != '\0') { if (a[i] == 'r') { *tree = create_tree(value); //   t = *tree; return *tree; } if (a[i] == 's') { if (t = to_son(t)) // ,      continue; return NULL; // NULL } if (a[i] == 'b') { if (t = to_brother(t)) //    t continue; return NULL; } } if (t->son != NULL) { t = last_son(t); //    ,    //      , //     t->brother = create_tree(value); return t->brother; } else {//  ,    t->son = create_tree(value); return t->son; } } 

这样我们就可以构建一棵树。

PS是我的第一篇文章,所以请不要严格判断

Source: https://habr.com/ru/post/zh-CN482814/


All Articles