在根树中插入(项) - LCRS表示

时间:2016-12-15 22:42:43

标签: c data-structures tree abstraction

以下是代码,

/* 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课程详细信息已经保留,

enter image description here 我的下面的问题是关于如何在root树中insert项目?

insert()功能以Treeitem为参数,insert()"~jrs/61b"

很容易(显而易见)

insert()firstChild nextSiblingrootedTree个项目的顺序是什么? insert()的两个给定参数是否足够?

例如,我需要insert()"hw1"&amp; "hw2"之后的"hw"?或insert() "index.html"之后我需要insert()"hw"吗?

我是否需要维护单独的函数以插入item作为下一个兄弟和第一个孩子?

注意:不要求代码。学习树木

1 个答案:

答案 0 :(得分:0)

  

使用insert()Tree作为参数的item函数,…   insert()的两个给定参数是否足够?

不,它们不能满足要求,因为无法从insert() ing 的顺序推导出树结构。

  

我是否需要维护单独的功能来插入item作为下一个兄弟姐妹和第一个孩子?

是,或等价的东西,例如告诉如何插入的参数。另外,将需要在其中添加新项目的节点作为参数。