收集BST的所有叶子并列出它们

时间:2016-01-10 11:47:10

标签: c tree binary-search-tree

我有一个定义了节点结构的简单BST:

struct node
{
  int key_value;
  struct node *left;
  struct node *right;
};

typedef struct node * tree;

现在我应该创建一个'leaves'函数,它将收集所有叶子的值并制作它们的列表,其中list是一个定义如下的结构

typedef struct l_node * pnode;

typedef struct
{
  int val;
  pnode next; 
} l_node;

问题是我无法找到如何将适当的指针传递给函数叶。我不知道它应该是指向pnode还是简单pnode的指针。我到目前为止所做的是:

pnode leaves(tree tr)
{
   // create a pointer to empty list 
   // and pass it to another function maybe?
}

// this is an extra function to go through all leaves
void leaves_rec(tree tr, pnode * node) // pnode or pnode *?
{
  if(tr == NULL)
    return;
  if(tr->left == NULL && tr->right == NULL)
    {
       // ???
    }
  else
    {
      if(tr->left != NULL)
    leaves_rec(tr->left, node);
      if(tr->right != NULL)
    leaves_rec(tr->right, node);
    }
}

1 个答案:

答案 0 :(得分:1)

我希望这个问题与学习和理解树和列表的工作方式有关。对于真正的应用程序,您应该考虑使用提供此功能的std库。

有一个给定的树节点结构。我宁愿把它命名为leaf,还要添加一些数据。通常,您使用树来管理某种数据。 我还添加了一个指向父元素的指针 - 如果你计划以某种方式平衡树,你将需要它。 树由一个根叶定义。

struct leaf {
  int key_value;
  leaf * top;
  leaf * left;
  leaf * right;
  void * data;
};

这是列表节点

struct {
  node * next; 
  void * data;
} node;

现在需要一个方法来创建给定树的列表。

node * leaves(leaf * tree) {
    node * list = new node();
    list->next = NULL;
    list->data = NULL;

    if (tree != NULL)
        leaf2node(tree, list);
    return list;
}

node * leaf2node(leaf * l, node * n) {
    // go left first
    if (l->left != NULL)
        n = leaf2node(l->left, n); // list node n is updated

    // omit this if statement, to collect the whole tree
    if (l->left == NULL && l->right == NULL) {
        // create a new list node and copy the data pointer
        node * add = new node();
        add->data = l->data;
        add->next = NULL;

        // append the list node and make the new node current
        n->next = add;
        n = add;
    }

    // go right
    if (l->right != NULL)
        n = leaf2node(l->right, n);  // list node n is updated

    return n;
}

通过更改左/右的位置,更改列表的顺序。