主题:这个算法好像有错误?
题目:在二叉链表的结点中只增设一个双亲域以指示其双亲结点,以此存储结构写不设栈进行中序遍历的递归形式的算法。
算法:typedef struct {
int data;
PBTNode *lchild;
PBTNode *rchild;
PBTNode *parent;
} PBTNode,PBitree; //有双亲指针域的二叉树结点类型
void Inorder_Nonrecursive(PBitree T)//不设栈非递归遍历有双亲指针的二叉树
{
p=T;
while(p->lchild) p=p->lchild; //向左走到尽头
while(p)
{
visit(p);
if(p->rchild) //寻找中序后继:当有右子树时
{
p=p->rchild;
while(p->lchild) p=p->lchild; //后继就是在右子树中向左走到尽头
}
else if(p->parent->lchild==p) p=p->parent; //当自己是双亲的左孩子时后继就是双亲
else
{
[color=FF0000]p=p->parent;
while(p->parent&&p->parent->rchild==p) p=p->parent;
p=p->parent;[/color] } //当自己是双亲的右孩子时后继就是向上返回直到遇到自己是在其左子树中的祖先
}//while
}//Inorder_Nonrecursive
我觉得以上加红色的地翻好像不对,
应该是:else if(p->parent&&p->parent->rchild==p) p=p->parent;
算法:typedef struct {
int data;
PBTNode *lchild;
PBTNode *rchild;
PBTNode *parent;
} PBTNode,PBitree; //有双亲指针域的二叉树结点类型
void Inorder_Nonrecursive(PBitree T)//不设栈非递归遍历有双亲指针的二叉树
{
p=T;
while(p->lchild) p=p->lchild; //向左走到尽头
while(p)
{
visit(p);
if(p->rchild) //寻找中序后继:当有右子树时
{
p=p->rchild;
while(p->lchild) p=p->lchild; //后继就是在右子树中向左走到尽头
}
else if(p->parent->lchild==p) p=p->parent; //当自己是双亲的左孩子时后继就是双亲
else
{
[color=FF0000]p=p->parent;
while(p->parent&&p->parent->rchild==p) p=p->parent;
p=p->parent;[/color] } //当自己是双亲的右孩子时后继就是向上返回直到遇到自己是在其左子树中的祖先
}//while
}//Inorder_Nonrecursive
我觉得以上加红色的地翻好像不对,
应该是:else if(p->parent&&p->parent->rchild==p) p=p->parent;