两种角度解释链域使用
从父结点角度
每个结点(除了根结点)都有一个父结点的链域指向它。这意味着在包含 n n n 个结点的二叉树中,有 n − 1 n-1 n−1 个链域被用于指向其他结点,因为根结点没有父结点指向它。
从子结点角度
每个非叶子结点都有两个链域,分别指向它的左子结点和右子结点。所以,如果一个结点是非叶子结点,它的两个链域都会被使用。
举例说明
考虑一个具体的二叉树:
A
/ \
B C
/ \ / \
D E F G
总结点数 n = 7 n = 7 n=7,总链域数 2 n = 14 2n = 14 2n=14。
从父结点角度看
- 除了根结点 A 之外,其他结点都有一个父结点的链域指向它:
- B 和 C 被 A 的链域指向
- D 和 E 被 B 的链域指向
- F 和 G 被 C 的链域指向
所以,使用的链域数是 n − 1 = 7 − 1 = 6 n-1 = 7-1 = 6 n−1=7−1=6。
从子结点角度看
-
每个非叶子结点都有两个链域指向它的子结点:
- A 有两个链域,分别指向 B 和 C
- B 有两个链域,分别指向 D 和 E
- C 有两个链域,分别指向 F 和 G
所以,非叶子结点使用的链域数是 6(与父结点角度一致)。
归纳总结
这两种角度描述的链域是同一回事。它们分别从父结点和子结点的角度描述了链域的使用情况:
- 父结点角度:除了根结点外,每个结点都有一个父结点的链域指向它,因此 n − 1 n-1 n−1 个链域被使用。
- 子结点角度:每个非叶子结点的两个链域指向它的子结点,这样也可以算出被使用的链域数。
空链域的来源总链域数是 2 n 2n 2n,实际使用的链域数是 n − 1 n-1 n−1,所以空链域数是:
2 n − ( n − 1 ) = n + 1 2n - (n-1) = n + 1 2n−(n−1)=n+1
tips:个人简单粗暴的理解
因为
n
−
1
n−1
n−1 条边连接着
n
n
n个结点,因此会有n+1个指针字段是空的。线索二叉树利用这些空指针来存放指向结点中序遍历前驱和后继的线索(即指针)。
即每新增一个结点,会占用其父节点的一个空指针,但其本身又会带来两个空指针,所以新增一个结点空指针数+1,即总空指针数为
n
−
1
n−1
n−1
【题目1】
设有n(n≥1)个结点的二叉树采用三叉链表表示,其中每个结点包含三个指针,分别指向其左孩子、右孩子及双亲(若不存在,则置为空),则树中空指针的数量为__。
【答案】
n+2
【解析】
分析三叉链表中的指针
每个结点有三个指针:
- 左孩子指针(left child pointer)
- 右孩子指针(right child pointer)
- 双亲指针(parent pointer)
总指针数
对于 n n n 个结点的二叉树,总指针数是 3 n 3n 3n,因为每个结点有三个指针。
空指针的计算
双亲指针
- 除了根结点外,每个结点都有一个双亲指针指向它的父结点。
- 因此,双亲指针中有 n − 1 n-1 n−1 个是非空的(因为根结点没有父结点指向它)。
- 所以,有 n − ( n − 1 ) = 1 n - (n-1) = 1 n−(n−1)=1 个双亲指针是空的(即根结点的双亲指针)。
左孩子和右孩子指针
- 每个结点最多有一个左孩子和一个右孩子,因此总共有 2 n 2n 2n 个孩子指针。
- 每个非叶子结点的孩子指针指向其子结点,叶子结点的孩子指针为空。实际使用的孩子指针数为 n − 1 n−1 n−1(因为 n − 1 n−1 n−1 条边连接着 n n n个结点)。
- 因此,有 2 n − ( n − 1 ) = n + 1 2n - (n-1) = n+1 2n−(n−1)=n+1 个孩子指针是空的。
空指针数
- 总指针数: 3 n 3n 3n(每个结点有三个指针)
- 非空指针数:双亲指针的 n − 1 n-1 n−1 个 + 孩子指针的 n − 1 n-1 n−1 个(指向子结点的) = 2 n − 2 2n-2 2n−2
- 空指针数:总指针数 3 n 3n 3n 减去非空指针数 2 n − 2 2n-2 2n−2 = 3 n − ( 2 n − 2 ) = n + 2 3n - (2n-2) = n+2 3n−(2n−2)=n+2 所以,树中空指针的数量为 n + 2 n+2 n+2。
【题目2】
具有n个结点的三叉树用三叉链表表示,则树中空指针域的个数为( )。
A.3n+1 B. 2n+1 C. 3n-1 D. 3n
【答案】
B
【题目3】
#5.3 27在线索二叉树中,下列说法不正确的是( )。
A. 在中序线索树中,若某结点有右孩子,则其后继结点是它的右子树的最左下结点
B. 在中序线索树中,若某结点有左孩子,则其前驱结点是它的左子树的最右下结点
C. 线索二叉树是利用二叉树的n+1个空指针来存放结点的前驱和后继信息的
D. 每个结点通过线索都可以直接找到它的前驱和后继