双链表和二叉树的节点结构有什么区别?

时间:2012-07-09 10:06:55

标签: c linked-list binary-tree


我在接受采访时被问及双链表和二叉树节点结构之间的区别。

双重链接列表结构

typedef struct
{
int data;
struct node * next;
struct node * prev;
}node;    

二叉树结构

typedef struct
{
int data;
struct node * left;
struct node * right;
}node;  
  1. 在双向链表中,我们使用指针在线性排列的列表中向后和向前遍历。
  2. 但是左和右的地方右指针用于访问左侧和右侧。正确的节点。
  3. 除了使用它们的方式之外,我发现节点结构没有任何区别。你能不能给我一些分歧?

3 个答案:

答案 0 :(得分:8)

我想你已回答了自己的问题。除了指针名称(next/prevleft/right)的明显差异外,差异在于:

  • 在双向链接列表中,如果n.next链接到m,则m.prev会链接到n。在二叉树中不是这种情况。
  • 在双向链表中,一个节点最多可以有两个链接。在二叉树中,每个节点最多只有一个链接。
  • 在双向链表中,可以跟随链接并最终到达您开始的节点。这在二叉树中是不可能的。

如果双向链表也是循环的,则以下内容也成立:

  • 在包含一个节点的循环双向链表中,n.nextn的{​​{1}}链接也链接到n.prev。这在二叉树中是不可能的:nn.left不链接到同一节点。
  • 在具有一个节点的二叉树中,n.rightn.next可以指向无节点(即树只是叶节点),但是在循环双向链表中,一个节点都是链接总是有一个值(虽然是同一个节点)。
  • 在二叉树中,可以选择n.prevn.left的值。如果二进制树不平衡,则可能是所有节点都具有n.right的值,但不是n.right的值。对于所有指针都有值的循环双向链表,情况并非如此。

在结构和内容方面,节点是相同的,但不同之处在于如何使用指针以及它们的值是什么。

答案 1 :(得分:4)

您可以概括:双向链表和二叉树都是有向图的示例,其中每个节点最多可以有两个输出边(因为结构中有多少个指针字段)。

每个数据结构都有额外的限制(例如,在两种情况下,整个图都可以从根节点到达,但只有在双向链表中才能从每个节点到达整个图)。这些限制表征了不同的数据结构,但对用于表示节点的结构没有影响。

有时你想要一个二叉树,其中每个节点还有一个指向其父节点的指针 - 在这种情况下,两个结构将是不同的。

答案 2 :(得分:3)

你是绝对正确的:假设相同的有效负载类型(在你的情况下是int),这两种节点类型的二进制布局是相同的。只有使用两个指针才能使两个节点类型不同。

如果您不关心可读性,可以使用节点

typedef struct node {
    int data;
    struct node *p1;
    struct node *p2;
} node;

表示二叉树和双向链表。但是,这不是一个好主意,因为代码会立即变得不易被其他程序员识别。