给定子指针和父指针创建树

时间:2014-03-18 19:34:29

标签: tree binary-tree packing

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

给出了示例文件:

Thisnode  parentnode  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

1 个答案:

答案 0 :(得分:1)

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

扫描仪

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

  1. 检查签名(-
  2. 检查char是否介于0..9之间,并将值应用于临时号码
  3. 如果1.2.为真,请阅读下一个数字
  4. 否则将临时号码应用于top-leaf,然后将机器升级到下一个州
  5. 排序

    迭代未排序的列表,找到" root"元件。使用初始值和子项,使用recursion"创建"填充二叉树结构的方法。有点像...

    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;
    }
    

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

    enter image description here