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);
}
这段代码是用来线索化二叉树的吗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 这段代码的主要作用是将给定的二叉树进行中序遍历,并添加线索以优化遍历算法。下面是分析 , 如有帮助给个采纳谢谢
- 定义一个数组s用来存储访问过的节点,以便在访问完右子树后回溯到其父节点。
- 创建一个新的节点t,并初始化其左线索lt、右线索rt以及左孩子lc、右孩子rc。如果原二叉树bt为空,则将t的左孩子lc和右孩子rc都指向它本身。
- 如果原二叉树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指向其右孩子,以遍历其右子树。
- 循环结束后,将t的右孩子rc指向pr,将pr的右线索rt设置为1,并将其右孩子rc指向t。
- 返回修改后的二叉树t。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 k8s生产配置推荐配置及部署方案
- ¥15 matlab提取运动物体的坐标
- ¥15 人大金仓下载,有人知道怎么解决吗
- ¥15 一个小问题,本人刚入门,哪位可以help
- ¥15 python安卓开发
- ¥15 使用R语言GD包一直不出结果
- ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
- ¥15 如何根据一个截图编写对应的HTML代码
- ¥15 stm32标准库的PID角度环
- ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!