下面是前序线索二叉树程序,程序现在出现死问题,当输入"ab///"('/'代表空树)时,不打印任何元素,倒,谁看看怎么回事,是线索函数错了,还是打印函数错了
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct node
{
char data;
struct node *lchild, *rchild;
int ltag, rtag;
}*Tree, Tnode; /* 二叉树结构 */
static void CreateTree(Tree *T); /* 创建二叉树 */
static void ThreadTree(Tree *T); /* 前序线索二叉树 */
static void PrintThreadTree(Tree T); /* 打印线索二叉树 */
static Tree NextPtr(Tree curPtr); /* 找下一个结点 */
int main(void)
{
Tree T = NULL;
CreateTree(&T);
ThreadTree(&T);
PrintThreadTree(T);
getch();
return 0;
}
static void CreateTree(Tree *T)
{
int ia;
ia = getchar();
if (ia == '/') /* 空树 */
{
*T = NULL;
}
else
{
if (((*T) = (Tree)malloc(sizeof(Tnode))) == NULL)
{
exit(1);
}
(*T) -> data = ia;
(*T) -> lchild = (*T) -> rchild = NULL;
CreateTree(&(*T) -> lchild);
CreateTree(&(*T) -> rchild);
}
}
static void ThreadTree(Tree *T) /* 前序线索二叉树 */
{
static Tree prePtr = NULL;
if (*T)
{
if ((*T) -> lchild == NULL) /* 确定左线索标志 */
{
(*T) -> ltag = 1;
}
if ((*T) -> rchild == NULL) /* 确定右线索标志 */
{
(*T) -> rtag = 1;
}
if (prePtr -> rtag == 1) /* 前驱线索化 */
{
prePtr -> rchild = *T;
}
if ((*T) -> ltag == 1) /* 后继线索化 */
{
(*T) -> lchild = prePtr;
}
prePtr = *T;
ThreadTree(&(*T) -> lchild);
ThreadTree(&(*T) -> rchild);
}
}
static void PrintThreadTree(Tree curPtr) /* 打印线索二叉树 */
{
while (curPtr) /* 首先打印根结点,然后依次找下一个结点 */
{
printf("%c -> ", curPtr -> data);
curPtr = NextPtr(curPtr);
}
printf("NULL\n");
}
static Tree NextPtr(Tree curPtr) /* 查找下一结点 */
{
if (curPtr -> ltag != 1) /* 有左子树返回左子树 */
{
return curPtr -> lchild;
}
else /* 否则返回右子树 */
{
return curPtr -> rchild;
}
}
结构不太好,用TC写的
[此贴子已经被作者于2006-5-23 21:17:31编辑过]