回 帖 发 新 帖 刷新版面

主题:复制二叉树的非递归算法实现,老是有点问题,希望大家能帮忙看一下啊,在线等

/*-------------复制二叉树的非递归算法--------------*/
{
    BiTNode *p,*q;
    SqStack S1,S2;
InitStack(&S1);
InitStack(&S2);
Push(&S1,T);
N=(BiTNode *)malloc(sizeof(BiTNode));
N->data=T->data;
q=N;
Push(&S2,N);
//Push(&S1,T->lchild);

while(StackEmpty(S1)!=0)
{
     while(GetTop(S1,&p)&&p)
     {
         q->lchild=(BiTNode*)malloc(sizeof(BiTNode));
         q=q->lchild;
         q->data=p->data;
         Push(&S1,p->lchild);
         Push(&S2,q);
     }/*到最左的孩子*/
     Pop(&S1,&p);/*退出空指针*/
    Pop(&S2,&q);

     if(StackEmpty(S1)!=0)
     {
        Pop(&S1,&p);
        Pop(&S2,&q);

       q->rchild=(BiTNode*)malloc(sizeof(BiTNode));
     q=q->rchild;q->data=p->data;
    Push(&S1,p->rchild);//向右一步
     //Push(&S2,q);
    }
  }//while

}//BiTree_Copy_Nonrecursive

谁能帮忙看看哪错了啊,谢谢大家了

回复列表 (共5个回复)

沙发

自己顶一下先

板凳

你把发生错误的详细情况说一下呀,你没有完整程序,要去逐行的看你的代码太费劲了。

3 楼


4 楼


调试的时候看一下栈的变化就会发现问题所在,
首先你看看复制的根节点的左孩子是否正确,
还有其他问题
不过我不知道怎么改。

5 楼

觉得用队列更好点,请看下面
void CopyBiTree(BiTree T, BiTree &TT)
/* 基于层次遍历的非递归复制二叉链表 */
{
 BiTree p,q;
 TT=(BiTree)malloc(sizeof(BiTNode));
 Queue Q1,Q2;
 if(!T) TT=NULL;
 InitQueue(Q1);
 InitQueue(Q2);
 EnQueue(Q1,T);    //根指针进栈
 EnQueue(Q2,TT);   //新二叉树的根指针也进栈
 while(!QueueEmpty(Q1))
   {
    DeQueue(Q1,p);
    DeQueue(Q2,q);        //出队列,并把p结点的值同赋给新二叉树当前结点
    q->data=p->data;     
    if(p->lchild)
      {
       EnQueue(Q1,p->lchild);      //如果p的左子树不空,进栈,同时给新二叉树新
       q->lchild=(BiTree)malloc(sizeof(BiTNode));    //生成一个结点,也进栈
       EnQueue(Q2,q->lchild);
      }
    if(p->rchild)
      {
       EnQueue(Q1,p->rchild);
       q->rchild=(BiTree)malloc(sizeof(BiTNode));
       EnQueue(Q2,q->rchild);
      }
   }
}

我来回复

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