moon_quake_s 2023-06-17 20:37 采纳率: 50%
浏览 8

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


 
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。
    评论

报告相同问题?

问题事件

  • 创建了问题 6月17日

悬赏问题

  • ¥15 k8s生产配置推荐配置及部署方案
  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环
  • ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!