回 帖 发 新 帖 刷新版面

主题:这个算法好像有错误?

题目:在二叉链表的结点中只增设一个双亲域以指示其双亲结点,以此存储结构写不设栈进行中序遍历的递归形式的算法。
算法: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;

回复列表 (共3个回复)

沙发

没人帮我呀

板凳

原程序正确

3 楼

{
      p=p->parent;          //返回到上一个结点
      while(p->parent&&p->parent->rchild==p) p=p->parent;
     //判定目前的结点是从左子树还是右子树回来的..如果是右子树 说明这个结点已经遍历过了。所以用直到循环  循环到p是其双亲结点的左子树。也就是说它双亲结点及其右子树还没被遍历。
       p=p->parent;    }  //返回到双亲结点

我来回复

您尚未登录,请登录后再回复。点此登录或注册