二叉树在线索化后
能解决的问题:
A.先序线索二叉树中求先序后继
B.中序线索二叉树中求中序后继
C.中序线索二叉树中求中序前驱
仍不能解决的问题
D.后序线索二叉树中求后序后继
二叉树线索化:对于一个结点,若无左孩子,则将左孩子指针(空链域)指向结点前驱;若无右孩子,则将右孩子指针(空链域)指向结点后继;
“利用链表的空链域”
A.先序线索二叉树中,一个结点的后继,是其子树;欲找其子树,
如果是[情况1]有左子树(只要有左子树,(仅有左子树和同时有左右子树的情况相同)后继一定是先左子树)从其左孩子指针中找;✅
如果是[情况2]仅有右子树:从其右孩子指针中找;✅
如果是[情况3]无左右子树:后继是其祖先的右孩子(如果当前是祖先的左孩子)或空(如果当前是祖先的右孩子,自己又无孩子,已到达遍历终点),这时用右孩子指针(为空)指向其后继(祖先的右孩子或NULL),因为右孩子指针为空,不冲突;✅
存在问题:
D.后序线索二叉树中求后序后继
后序线索二叉树中,一个结点的后继,是其祖先的右孩子(如果当前是祖先的左孩子)或祖先(如果当前是祖先的右孩子)
但不管该结点是祖先的左孩子,还是该结点是祖先的右孩子,都不影响“该结点可以有左右子树”;当该结点有右子树时,其右孩子结点指针被占用,永远无法指向其后继;
B.C.选项辨析
中序线索二叉树中,一个结点的前驱是其祖先(若其无左子树,且结点为祖先的右孩子(若否,为NULL,该结点在中序遍历的首位)),或其左子树的最右下结点(若其有左子树),
= = = =
C.中序线索二叉树中求中序前驱
若其有左子树,前驱为左子树的最右下结点,存放在左孩子指针 ✅
若其无左子树,则左孩子指针为空,前驱为祖先或空,存放在左孩子指针✅
全部两种情况不产生冲突;
= = = = =
中序线索二叉树中,一个结点的后继是其右孩子(若有右子树),其右边节点(若其无右子树)
B.中序线索二叉树中求中序后继
当有右孩子时,其后继是其右孩子。当无右孩子时,右孩子指针为空,可用于指向后继,不产生冲突✅