【问题标题】:Creating a tree given the child and parent pointers在给定子指针和父指针的情况下创建树
【发布时间】:2014-03-18 19:34:28
【问题描述】:

我有一个文件,其中包含一组数字,每行都有其父编号和子编号。我想在 C 中用它构建一棵树。我将如何完成它?

给出了示例文件:

Thisnode 父节点 lchildnode rchildnode 1 14 -1 -1 2 13 -1 -1 3 10 -1 -1 4 9 -1 -1 5 13 -1 -1 6 11 -1 -1 7 9 -1 -1 8 12 -1 -1 9 10 7 4 10 11 3 9 11 12 10 6 12 15 11 8 13 14 2 5 14 15 13 1 15 -1 14 12

【问题讨论】:

  • 看起来像作业,我错了吗?

标签: tree binary-tree packing


【解决方案1】:

完成此任务分为两个部分。构建一个简单的scanner,并将一个未排序的列表组织成一个binary tree 结构。

扫描仪

创建一个具有四个阶段(thisnode、parentnode、lchildnode、rchildnode)的finite-state machine。当机器处于第一个状态(thisnode)时,分配一个新的“未排序”叶子到列表的“顶部”。该列表应该足够大以容纳所有叶节点。还要记住在最后阶段(rchildnode)结束时重置机器状态。 最后,从输入中读取一个char,一次一个,然后评估以下条件。

  1. 检查签名 (-)
  2. 检查 char 是否介于 0..9 之间并将值应用于临时数字
  3. 如果1.2. 为真,请阅读下一个数字
  4. 否则将临时编号应用于 top-leaf,并将机器推进到下一个状态

排序

遍历未排序的列表,并找到“根”元素。使用初始值和子项,使用recursion“create”方法来填充您的二叉树结构。比如……

struct node {
  int value;
  struct node * left; 
  struct node * right;
};
struct node * create_node(int keyvalue, int lkey, int rkey)
{
  struct node * n = malloc(sizeof(struct node));
  n->value = keyvalue;
  n->left = 0;   
  n->right = 0;
  if(lkey > -1)
  {
    int llkey = your_iterator_left(lkey);
    int lrkey = your_iterator_right(lkey);
    n->left  = create_node(lkey,llkey,lrkey);
  }
  if(rkey > -1)
  {
    int rlkey = your_iterator_left(rkey);
    int rrkey = your_iterator_right(rkey);
    n->right  = create_node(rkey,rlkey,rrkey);
  }
  return n;
}

不是最干净的,但它会生成一个完整的二叉树。

【讨论】:

  • 真的需要扫描仪吗?从每一行读取 4 个ints 就足够了。
  • 如果数据文件本质上是二进制的,没有。 -1 的出现是对 ANSI atoi 课程作业的赠品。
猜你喜欢
  • 2017-10-09
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2016-06-02
  • 2012-01-10
  • 2021-05-27
相关资源
最近更新 更多