C中二叉树中内部和外部节点的表示

时间:2011-07-25 12:18:43

标签: c data-structures

我正在阅读Tannenbaum的C和C ++数据结构。以下是书中的文字片段

  

非叶​​子节点称为内部节点,叶子称为外部节点   节点。当仅有单一类型的节点时,通常使用该术语   定义。当然,内部节点中的子指针必须是   被识别为指向内部和外部节点。这可以   以两种方式完成:

     
      
  1. 一种技术是声明两种不同的节点类型和指针   类型和使用每个替代的内部节点的联合   包含两种指针类型之一。
  2.   
  3. 其他技术是保留单一类型的指针和单个指针   节点的类型,其中节点是一个联合(如果节点是   内部节点)或不(如果是外部节点)包含left和   右指针字段。
  4.   

我的问题是

(A)作者在内部节点中的意思是什么?

(B)任何人都可以定义C中两种技术的示例结构来理解语句吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

作者在内部节点中的意思是什么?

我认为该文本是关于称为树的数据结构。构建这种结构的方法之一是定义C结构(sic!),如下所示:

struct Node {
    int someData;
    struct Node *left, *right;
};

因此,作者所指的儿子指针是具有指针类型的这些leftright字段。它们通常被称为 child 指针。

  

任何人都可以在C中定义两种技术的示例结构来理解语句吗?

这是他们。

(1)

struct InternalNode;
struct ExternalNode;

union ChildPointer {
    struct InternalNode *asInternal;
    struct ExternalNode *asExternal;
};

struct InternalNode {
    // Some data here

    union ChildPointer left, right;
};

struct ExternalNode {
    // External node data here
};

但是,我不打算解释如何预先知道节点的左子节点是内部节点还是外部节点,可能应该知道内部状态,或者可能只有一个ExternalNode结构的实例,所有非叶节点链接和直接比较是可能的,也许有人可以建议。

(2)

union Node;
struct InternalData {
    // Internal node data here

    union Node *left, *right;
};

struct ExternalData {
    // External node data here
};

union Node {
    struct InternalData internal;
    struct ExternalData external;
};

使用匿名结构/联合可以使这更方便,但这是C的ms扩展。

只有当你试图在不包含数据的叶节点上保存一些内存或者如果它们确实需要一些内部节点不需要的额外内存时,这在理论上才有意义。