BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #100399同步于 2022/4/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

请教一下关于线索二叉树的问题

yb7858833
2022/4/4镜像同步7 回复
void buildPostThread(TBTnode *p, TBTnode *&pre) { if (p != nullptr) { buildInThread(p->lchild, pre); buildInThread(p->rchild, pre); //对下一个结点操作时 才对前驱结点的rtag和rchild进行改变,则中序遍历下最后一个结点(最右)的rtag仍然为0 //但是第一个结点的ltag和lchild会改变 if (p->lchild == nullptr) { p->ltag = 1; p->lchild = pre; } if (pre != nullptr && pre->rchild == nullptr) { pre->rtag = 1; pre->rchild = p; } pre = p; } }
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
yb7858833机器人#1 · 2022/4/4
这个是构建中序线索二叉树的算法,很多博客和指导书都这样写的,但是有一个问题是最后一个遍历的结点(最右边的那个结点)的rtag为0,正常来说不是应该是1嘛?
yb7858833机器人#2 · 2022/4/4
比如这样一个结点 // 1 // / \ // 2 7 // / \ / // 3 4 8 // / \ // 5 6 他这个结点7的右子结点应该也是个线索,但是这个代码运行下来实际上rtag是0
yb7858833机器人#3 · 2022/4/4
如果按我改成这样 7的rtag就是1了 void buildInThread(TBTnode *p, TBTnode *&pre) { if (p != nullptr) { if (p->lchild == nullptr) { p->ltag = 1; p->lchild = pre; } else { buildInThread(p->lchild, pre); } if (pre != nullptr && pre->rchild == nullptr) { pre->rchild = p; } if (p->rchild == nullptr) { p->rtag = 1; } pre = p; p = p->rchild; buildInThread(p, pre); } }
yb7858833机器人#4 · 2022/4/4
因为王道和天勤都是跟1楼这个代码一样写的 所以我不知道到底应该怎么写好了
Beegerous机器人#5 · 2022/4/11
最后那个节点的右儿子标不标成线索反正都是nullptr,应该无所谓吧,虽然按照定义来说需要rtag=1,不过应该不用那么较真
yb7858833机器人#6 · 2022/4/11
天勤上后面写了解释我没看到 他的意思是函数结束后在外部手动pre.rtag=1 【 在 Beegerous 的大作中提到: 】 : 最后那个节点的右儿子标不标成线索反正都是nullptr,应该无所谓吧,虽然按照定义来说需要rtag=1,不过应该不用那么较真
yb7858833机器人#7 · 2022/4/11
写其他遍历算法要用到 比如查找最右子树 如果不把这个rtag设为1 那么在判断是否继续往右下走时还要判断rchild != nullptr了 【 在 Beegerous 的大作中提到: 】 : 最后那个节点的右儿子标不标成线索反正都是nullptr,应该无所谓吧,虽然按照定义来说需要rtag=1,不过应该不用那么较真