前序遍历(中左右)、中序遍历(左中右)的最后访问的节点都是左或右叶节点,叶节点是没有子树的,所以两个指针域空出来了,可以存放线索指针。但是后续遍历(左右中),最后访问的子树的根节点,子树根节点的两个指针域都指向子树了,所以不能空出来存放线索信息。
前序不是根左右嘛,相当于先线索化了,再递归左右子树。如果你不在前面加判断语句,那么程序就会把线索也给当成左右孩子,于是就不断进行递归左右子树(绕圈圈~),最终导致死循环。
刚好复习到这,举个例子,若A是根节点,B是A的左孩子,B没有左孩子,那么根据先序遍历先访问A,再访问B,此时pre是指向A的,而B没有左孩子,所以建立线索,B的lchild指向A。这时若不判断tag,将继续访问B的lchild,也就是A,形成死循环。
而中序和后序不进行判断是因为向左递归的操作在访问前,不会出现这种情况。
我来补充回答一下这个老帖吧,D<->H建立好双向连接,而且目前H也访问完毕,会返回到D那边,然后D会接下来访问rchild,如果不经过if判断就直接访问,结果是又回到了H,H访问完又回到D...反反复复死循环造成栈溢出