我在接受采访时被问及双链表和二叉树节点结构之间的区别。
双重链接列表结构
typedef struct
{
int data;
struct node * next;
struct node * prev;
}node;
二叉树结构
typedef struct
{
int data;
struct node * left;
struct node * right;
}node;
除了使用它们的方式之外,我发现节点结构没有任何区别。你能不能给我一些分歧?
答案 0 :(得分:8)
我想你已回答了自己的问题。除了指针名称(next/prev
和left/right
)的明显差异外,差异在于:
n.next
链接到m
,则m.prev
会链接到n
。在二叉树中不是这种情况。如果双向链表也是循环的,则以下内容也成立:
n.next
和n
的{{1}}链接也链接到n.prev
。这在二叉树中是不可能的:n
和n.left
不链接到同一节点。n.right
和n.next
可以指向无节点(即树只是叶节点),但是在循环双向链表中,一个节点都是链接总是有一个值(虽然是同一个节点)。n.prev
或n.left
的值。如果二进制树不平衡,则可能是所有节点都具有n.right
的值,但不是n.right
的值。对于所有指针都有值的循环双向链表,情况并非如此。在结构和内容方面,节点是相同的,但不同之处在于如何使用指针以及它们的值是什么。
答案 1 :(得分:4)
您可以概括:双向链表和二叉树都是有向图的示例,其中每个节点最多可以有两个输出边(因为结构中有多少个指针字段)。
每个数据结构都有额外的限制(例如,在两种情况下,整个图都可以从根节点到达,但只有在双向链表中才能从每个节点到达整个图)。这些限制表征了不同的数据结构,但对用于表示节点的结构没有影响。
有时你想要一个二叉树,其中每个节点还有一个指向其父节点的指针 - 在这种情况下,两个结构将是不同的。
答案 2 :(得分:3)
你是绝对正确的:假设相同的有效负载类型(在你的情况下是int
),这两种节点类型的二进制布局是相同的。只有使用两个指针才能使两个节点类型不同。
如果您不关心可读性,可以使用节点
typedef struct node {
int data;
struct node *p1;
struct node *p2;
} node;
表示二叉树和双向链表。但是,这不是一个好主意,因为代码会立即变得不易被其他程序员识别。