以下是代码,
/* tree.c */
#include"tree.h"
int main(){
Tree *rootedTree = newTree();
insert(rootedTree, "~jrs/61b");
preOrder(rootedTree);
printf("\n");
}
/* tree.h */
#include<stddef.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct SiblingTreeNode{
struct SiblingTreeNode *parent;
void *item;
struct SiblingTreeNode *firstChild;
struct SiblingTreeNode *nextSibling;
}Node;
typedef struct LCRSTree{
Node *root;
int size;
}Tree;
Tree * newTree(void){
Tree *rootedTree = malloc(sizeof(Tree));
rootedTree->root = NULL;
rootedTree->size = 0;
return rootedTree;
}
void insert(Tree *rootedTree, const void *item){
if(rootedTree->root == NULL){
Node *rootNode = malloc(sizeof(Node));
rootNode->parent = NULL;
rootNode->item = malloc(sizeof(strlen((const char *)item) + 1));
strcpy((char *)rootNode->item, (const char *)item);
rootNode->firstChild = NULL;
rootNode->nextSibling = NULL;
rootedTree->root = rootNode;
rootedTree->size = 0;
}else{
/*
Who takes care of the ordering of inserting items?
User or insert() function?
*/
}
}
void visit(Node *node){
printf("\n(%s)", (char *)(node->item));
}
/*
Pre-order traversal.
Visit each node before recursively visiting its children, left to right.
Root visited first
*/
void preOrderTraverse(Node * node){
visit(node);
if(node->firstChild){
printf("\n|");
preOrderTraverse(node->firstChild);
}
if(node->nextSibling){
printf("-->");
preOrderTraverse(node->nextSibling);
}
}
void preOrder(Tree *tree){
preOrderTraverse(tree->root);
}
对于使用LCRS表示的root树。
使用Tree
抽象,如果我需要构建一个树,如下所示,其中cs61b
课程详细信息已经保留,
insert()
功能以Tree
和item
为参数,insert()
项"~jrs/61b"
insert()
中firstChild
nextSibling
和rootedTree
个项目的顺序是什么? insert()
的两个给定参数是否足够?
例如,我需要insert()
,"hw1"
&amp; "hw2"
之后的"hw"
?或insert()
"index.html"
之后我需要insert()
,"hw"
吗?
或
我是否需要维护单独的函数以插入item
作为下一个兄弟和第一个孩子?
注意:不要求代码。学习树木
答案 0 :(得分:0)
使用
insert()
和Tree
作为参数的item
函数,…insert()
的两个给定参数是否足够?
不,它们不能满足要求,因为无法从insert()
ing 的顺序推导出树结构。
我是否需要维护单独的功能来插入
item
作为下一个兄弟姐妹和第一个孩子?
是,或等价的东西,例如告诉如何插入的参数。另外,将需要在其中添加新项目的节点作为参数。