欢迎大家来讨论,关于树的问题

Aktankll 2002-05-25 05:55:55
能否在一棵中序全线索二叉树上查找给定结点*p在后序序列中的后继?


知我者谓我心忧;
不知我者谓我何愁。
...全文
57 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
starfish 2002-05-26
  • 打赏
  • 举报
回复
很简单呀,关键就在于区分节点p是其父节点的左儿子还是右儿子这两种情况。
既然是中序线索二叉树,那么可以从节点p找到他的中序后继q。有两种情况:
1。如果q为空,则说明p是中序遍历中最后一个节点,也就是二叉树的最右下边的节点,因此我们只需要在二叉树中找到p的父节点r(从根节点开始递归地找),r就是p在后序序列中的后继。这种情况下无法利用到线索二叉树的优越性,算法复杂度和后序遍历的复杂度一样。
2。如果p的中序后继q不为空,则q一定有左儿子。这时又有两种情况:
(a) q的左儿子就是p,那么q的右儿子就是p在后序遍历中的后继;
(b) q的左儿子不是p,那么p一定在q的左儿子的最右下方。换句话说,我们只要从q的左儿子出发,一直沿着二叉树的右分支走,如果遇到某个节点r的右儿子是p,则该节点r就是p在后序遍历中的后继。

算法的伪代码如下:
1. q ← p的中序序列后继;
2. if q = NIL
3. then 从二叉树根节点出发,递归地找到p的父节点r;
4. return r;
5. else if q.left = p
6. then return q.right;
7. else r ← q.left;
8. while r.right <> p
9. do r ← r.right;
10. return r;

上述伪代码中用缩进表示代码的嵌套层次。
Aktankll 2002-05-26
  • 打赏
  • 举报
回复
问题的关键是如何在中序线索二叉树中找到结点*p的最近祖先。在右子树上怎么判断找到的祖先是最近的?


知我者谓我心忧;
不知我者谓我何愁。
Aktankll 2002-05-26
  • 打赏
  • 举报
回复
谢谢海星大哥以前对我的无私帮助,并在一次感谢海星对我的指点。你的回复我认真看过啦。很有感触,我就想问,为什么我自己在想这题的时候
真是一锅粥,没有一点头绪。请你给我介绍一下你是怎样找到处理问题的
突破口的。万分感谢!
opengl3d 2002-05-26
  • 打赏
  • 举报
回复
可以地呀
yuyuyu_2001 2002-05-25
  • 打赏
  • 举报
回复
我想可以;在一棵中序全线索二叉树上给定结点*p,由中序序列求得*p
最近祖先(若p在左子树,找到父节点;在右子树,找到其祖先)
再由祖先出发,递归搜索
liuweiwei1 2002-05-25
  • 打赏
  • 举报
回复
当然可以
事在人为吗
one_add_one 2002-05-25
  • 打赏
  • 举报
回复
看不懂:(

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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