讨论贴:不用栈实现二叉树非递归中序遍历

猫已经找不回了 2009-12-24 02:40:12
偶尔看到这样一个问题:

有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针。
要求不用递归,中序遍历这棵树。另要求空间复杂度是O(1).


觉得蛮有意思,昨天实现了一下.

代码写在这里:
http://blog.csdn.net/hairetz/archive/2009/12/24/5069128.aspx

希望各位就思路,或者具体实现提供一点改进的想法,或者自己实现,贴出代码,大家分享一下也可以.

...全文
349 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 baihacker 的回复:]
在这里讨论这种问题不是地方啊。。。
[/Quote]

默哀,结贴了。。
小小攻城师 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 baihacker 的回复:]
在这里讨论这种问题不是地方啊。。。
[/Quote]
高手对话啊
我是来接分的
baihacker 2009-12-28
  • 打赏
  • 举报
回复
在这里讨论这种问题不是地方啊。。。
yujunliang316 2009-12-28
  • 打赏
  • 举报
回复
UP
  • 打赏
  • 举报
回复
除了do_fork跟飞雪就没人响应我一下么。。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 baihacker 的回复:]
引用 10 楼 hairetz 的回复:
飞雪原来最近在线啊,刚才还在想要不要发这个链接给你看下。。

你木点选择有回复的时候通知。。。
闪去图书馆了。。。
[/Quote]

神奇。。。你怎么知道的?莫非我old了。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 do_fork 的回复:]
pre指针,指向到达当前节点的路径中的上一个节点,只需要知道从哪里来,所以只要一个pre就够了
然后把pre跟lchild,rchild,parent做比较,得到3种状态之一,
1. 从父节点过来
2. 从左子过来
3. 从右子过来
把当前节点跟parent的左右子比较,得出当前节点是左子还是右子
然后把当前节点,根据是否有左右子,路径中上一节点,是父节点的左子还是右子划分为几个状态

当成一个类似状态机的来做, 当前状态 -> 行为
行为包括:是否输出当前节点,去往哪个节点,更新pre
[/Quote]

思路基本一致,你对终止条件判断有啥好建议不?
baihacker 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hairetz 的回复:]
飞雪原来最近在线啊,刚才还在想要不要发这个链接给你看下。。
[/Quote]
你木点选择有回复的时候通知。。。
闪去图书馆了。。。
  • 打赏
  • 举报
回复
飞雪原来最近在线啊,刚才还在想要不要发这个链接给你看下。。
nwao7890 2009-12-24
  • 打赏
  • 举报
回复
学习!
do_fork 2009-12-24
  • 打赏
  • 举报
回复
pre指针,指向到达当前节点的路径中的上一个节点,只需要知道从哪里来,所以只要一个pre就够了
然后把pre跟lchild,rchild,parent做比较,得到3种状态之一,
1. 从父节点过来
2. 从左子过来
3. 从右子过来
把当前节点跟parent的左右子比较,得出当前节点是左子还是右子
然后把当前节点,根据是否有左右子,路径中上一节点,是父节点的左子还是右子划分为几个状态

当成一个类似状态机的来做, 当前状态 -> 行为
行为包括:是否输出当前节点,去往哪个节点,更新pre
baihacker 2009-12-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/baihacker/archive/2008/08/20/2803385.aspx


//n久前的代码
//算法来源是taocp
//后序的更复杂。。。杯具
template<typename Type>
template<typename OP>
void AVLTree<Type>::PreInOrder(int type, OP ope)
{
pNodeType Curr = head->LChild;
pNodeType R = NULL;

while (true)
{
if (Curr == NULL) break;

pNodeType q = Curr->LChild;
if (q == NULL)
{
ope(Curr->Data);
R = Curr;
Curr = Curr->RChild;
}
else
{
while (q->RChild != NULL && q->RChild != Curr)
q = q->RChild;
if (q->RChild == NULL)
{
q->RChild = Curr;
if (type == 0) ope(Curr->Data);;
Curr = Curr->LChild;
}
else
{
R = Curr;
if (type == 1) ope(Curr->Data);
Curr = Curr->RChild;
q->RChild = NULL;
}

}
}
}

z569362161 2009-12-24
  • 打赏
  • 举报
回复
收起来了
ArmStronger 2009-12-24
  • 打赏
  • 举报
回复
顶贴学习两不误
z569362161 2009-12-24
  • 打赏
  • 举报
回复
在次学习,永远学习,努力学习
z569362161 2009-12-24
  • 打赏
  • 举报
回复
2楼的来看学习.

james_hw 2009-12-24
  • 打赏
  • 举报
回复
bd
james_hw 2009-12-24
  • 打赏
  • 举报
回复
先抢sf

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧