为什么先序/中序线索二叉树不需要栈的支持,而后序线索二叉树需要栈的支持?
首先要明确两点
先序线索二叉树的缺点:无法找到先序序列中某结点的前驱
后序线索二叉树的缺点:无法找到后序序列中某结点的后继
中序线索二叉树 | 先序线索二叉树 | 后序线索二叉树 | |
---|---|---|---|
找前驱 | √ | × | √ |
找后继 | √ | √ | × |
问题的重点不在叶子结点,因为叶子结点的空链域指向了它的前驱和后继,无需外界提供特别的支持就能找到其前驱和后继,所以问题的根源其实在于非叶子结点
下图我们以先序线索树为例,先序线索树只能找后继,1的后继为2,2为1的左孩子。5的后继为6,6为5的左孩子,故先序二叉树中所有结点均可找到其后继结点。而若要在先序线索二叉树中找前驱,则需要将其改为三叉链表。
下图我们以中序线索树为例,中序线索树既可以找前驱也可找后继,2的前驱为1,1为2的左孩子,2的后继为3,3为2的右孩子。故先序二叉树中所有结点均可找到其前驱和后继结点,无需其他工具的支持即可完成寻找前驱和后继结点的工作
下图我们以后序线索树为例,后序线索树只能找前驱,6的后继为7,但6的两个指针域中一个指向了它的前驱5,一个指向了4,由于没有第三个指针(所以用三叉链表可以解决此问题)故无法找到其后继,需要借助其他工具(如栈)帮助完成
下图为后序遍历过程,我们可以通过栈来获得后序线索二叉树中所有结点的后继,下述过程依次输出1234567