问答题
请用类C或用类Pascal语言编写算法。请编写在中序全线索二叉树T中的结点P下插入一棵根为X的中序全线索二叉树的算法。如果尸左右孩子都存在,则插入失败并返回FAI,SE;如果P没有左孩子,则X作为尸的左孩子插入;否则X作为P的右孩子插入。插入完成后要求二叉树保持中序全线索并返回TRUE。【上海大学2002七、1(10分)】
【正确答案】正确答案:在中序全线索化T树的P结点上,插入以X为根的中序全线索化二叉树,要对X有无左右子树进行讨论,并修改X左(右)子树上最左结点和最右结点的线索。在中序线索树上查找某结点p的前驱的规律是:若p一>ltag=1,则p一>lchild就指向前驱,否则,其前驱是p的左子树上按中序遍历的最后一个结点;查找某结点p的后继的规律是:若p一>rtag=1,则p一>rchild就指向后继,否则,其后继是p的右子树上按中序遍历的第一个结点。这里只讨论P有左子女,将X插为P的右子女的情况。核心语句段如下: if(P一>ltag==0) //p有左子女,将x插为p的右子女 {if(x一>l七ag==1)x一>lchild=P; //若x无左子树, x的左线索(前驱)是P else //寻找x的左子树上最左(下)边的结点 {q=x一>lchild; while(q一>ltag==0) q=q一>lchild; q一>lchild=p; } if(X一>rtag==1) x一>rchi.1d=P一>rchild; //修改x的右线索,将P的右线索改为x的右线索 else //找x右子树最右面的结点 {q=x一>rchild; while(q一>rtag==0) q=q一>rchild; q一>rchild=P一>rchild; } P一>rtag=0 ; p一>rch~Id=x; //将x插入为P的右子树 } //结束将x插入为p的右子树
【答案解析】