moon_quake_s 2023-06-17 20:37 采纳率: 50%
浏览 10
已结题

这段代码是用来线索化二叉树的吗


 
TBinTree  zxxsh(TBinTree bt)
{TBinTree p,pr,s[M],t;
   int i=0;
   t=(TBinTree)malloc(sizeof(TBinTreeNode));
   t->lt=0; t->rt=1;   t->rc=t;
   if(bt==NULL)       t->lc=t;
   else
   {  t->lc=bt;  pr=t;   p=bt;
      do{   while(p!=NULL)
  {   s[i++]=p;  p=p->lc; }
    if(i>0)
    {   p=s[--i];
        printf("%c  ",p->data);
        if(p->lc==NULL)
        {   p->lt=1;  p->lc=pr;}
        if(pr->rc==NULL)
        {   pr->rt=1; pr->rc=p;}
        pr=p;    p=p->rc;
    }
      }while(i>0||p!=NULL);
      pr->rc=t; pr->rt=1;  t->rc=pr;
   }
   return(t);
}
  • 写回答

3条回答 默认 最新

  • 全栈若城 新星创作者: 编程技术技术领域 2023-06-17 20:48
    关注

    这段代码的主要作用是将给定的二叉树进行中序遍历,并添加线索以优化遍历算法。下面是分析 , 如有帮助给个采纳谢谢

    1. 定义一个数组s用来存储访问过的节点,以便在访问完右子树后回溯到其父节点。
    2. 创建一个新的节点t,并初始化其左线索lt、右线索rt以及左孩子lc、右孩子rc。如果原二叉树bt为空,则将t的左孩子lc和右孩子rc都指向它本身。
    3. 如果原二叉树bt不为空,则初始化指针pr和p分别指向bt和bt的左孩子。然后进行循环,直到数组s为空且p为NULL为止:
      • 当p不为空时,将p压入数组s中,并将p指向其左孩子,以遍历其左子树。
      • 当p为空但数组s不为空时,弹出数组s中的元素p,并访问其值。如果p的左孩子为NULL,则将p的左线索lt设置为1,并将其左孩子lc指向pr。如果pr的右孩子为NULL,则将pr的右线索rt设置为1,并将其右孩子rc指向p。最后,将pr指向p,并将p指向其右孩子,以遍历其右子树。
    4. 循环结束后,将t的右孩子rc指向pr,将pr的右线索rt设置为1,并将其右孩子rc指向t。
    5. 返回修改后的二叉树t。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 创建了问题 6月17日