Data structures 树的左子级、右同级表示是什么?你为什么要用它?
许多数据结构使用称为表示的表示将多路树存储为二叉树。这是什么意思?为什么要使用它?左子右同级表示法(LCRS)是一种使用编码(每个节点可以有任意数量的子节点的树结构)(每个节点最多可以有两个子节点的树结构)的方法 动机 为了激发这种表示法的工作原理,让我们首先考虑一个简单的多向树,如下所示:Data structures 树的左子级、右同级表示是什么?你为什么要用它?,data-structures,tree,binary-tree,multiway-tree,Data Structures,Tree,Binary Tree,Multiway Tree,许多数据结构使用称为表示的表示将多路树存储为二叉树。这是什么意思?为什么要使用它?左子右同级表示法(LCRS)是一种使用编码(每个节点可以有任意数量的子节点的树结构)(每个节点最多可以有两个子节点的树结构)的方法 动机 为了激发这种表示法的工作原理,让我们首先考虑一个简单的多向树,如下所示: A //|\ \ / / | \ \ B C D E F
A
//|\ \
/ / | \ \
B C D E F
| /|\ / \
G H I J K L
(对低质量的ASCII图形表示歉意!)
在这个树结构中,我们可以从树中的任何节点向下导航到它的任何子节点。例如,我们可以从A迁移到B,从A迁移到C,从A迁移到D,等等
如果我们想在这样的树中表示一个节点,我们通常会在这里使用这样的节点结构/节点类(用C++编写):
请注意,在这个新结构中,仍然可以从父节点导航到其第k个子节点(零索引)。执行此操作的程序如下所示:
- 下降到当前节点的左侧子节点。(这是其子节点列表中的第一个节点)
- 跟随那个孩子的右兄弟指针k次。(这会将您带到节点的第k个子节点)
- 返回该节点
struct Node {
DataType data;
Node* leftChild;
Node* rightSibling;
};
此节点结构与二叉树中的节点形状完全相同(数据加上两个指针)。因此,LCRS表示法使每个节点仅使用两个指针就可以表示任意多路树
分析
现在让我们看一下多路树的两种不同表示形式的时间和空间复杂性,以及它的一些基本操作
让我们先看看初始“动态子数组”表示所需的总空间使用情况。n节点树的总内存使用量是多少?那么我们知道以下几点:
A
/
/
/
B -> C -> D -> E -> F
/ / /
G H->I->J K->L
struct Node {
DataType data;
Node* leftChild;
Node* rightSibling;
};
R1 R2
/ /
(children 1) (children 2)
R1
/
R2
/ \
(children 2) (children 1)