一道最新的关于二叉查找树算法问题

Flammable_ice 2014-06-12 04:29:47
假设为每个结点换一种设计,属性x.p指向x的双亲,属性x.succ指向x的后继。试给出使用这种表示法的二叉搜索树T上的查找,插入,删除函数的代码。这些代码应在O(h)时间内执行完。h为树的高度。(提示:应该设计一个返回某个结点的双亲子过程。)
...全文
515 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
马小阳 2018-06-06
  • 打赏
  • 举报
回复
您好,我想问下为什么“先找到子树的最右侧叶子,然后取其后继”这样就能找到节点的父节点呢?比如下面这棵树,如何得到节点D的父节点呢? A / B / \ C D
Flammable_ice 2014-07-17
  • 打赏
  • 举报
回复
引用 1 楼 zhy___zhy 的回复:
这道题目中文版翻译有错。查看英文原版后可知,题目原意为“将二叉树的parent指针替换为successor指针”,即新的节点有左子树、右子树和后继节点三个指针。 使用这三个指针,可以在O(h)时间内找到节点的parent指针(先找到子树的最右侧叶子,然后取其后继)。 搜索和插入操作本身不需要parent指针,因此所需时间不变仍为O(h),但是插入时需要考虑对successor指针的维护,也是O(h),因此总时间为O(h)。 删除操作比较麻烦,不过应该只需要用到常数次找parent节点的操作,因此这方面是O(h),但是需要更新被删除元素的前驱节点的后继指针,“找前驱节点”这个操作好像不一定是O(h),当前驱节点在当前节点祖父的位置时?期待讨论~
我又想了一下,删除和插入操作还是O(h)。 插入操作: 如果新结点z插入到结点x的左边,那么z.suc=x,若插入到右边,那么z.suc=x.suc; x.suc=z; 删除操作:对应《算法导论》第12章那4张删除图abcd。 a) if(z->p->r==z) q.suc=z.suc; b)if(z->p->l==z)找到l子树的最大子结点max(l).max(l).suc=q;else if(z->p->l==z) l.suc=NULL; c)max(l).suc=y; d)在c的基础上添加一条判断 if(x.r==NULL) x.suc=x.p. 我想了半天,大概就这么多了。
Flammable_ice 2014-07-17
  • 打赏
  • 举报
回复
引用 1 楼 zhy___zhy 的回复:
这道题目中文版翻译有错。查看英文原版后可知,题目原意为“将二叉树的parent指针替换为successor指针”,即新的节点有左子树、右子树和后继节点三个指针。 使用这三个指针,可以在O(h)时间内找到节点的parent指针(先找到子树的最右侧叶子,然后取其后继)。 搜索和插入操作本身不需要parent指针,因此所需时间不变仍为O(h),但是插入时需要考虑对successor指针的维护,也是O(h),因此总时间为O(h)。 删除操作比较麻烦,不过应该只需要用到常数次找parent节点的操作,因此这方面是O(h),但是需要更新被删除元素的前驱节点的后继指针,“找前驱节点”这个操作好像不一定是O(h),当前驱节点在当前节点祖父的位置时?期待讨论~
你的解答,使我恍然大悟,原来是翻译问题,,我说也不会有双亲指针,最后提示让做一个函数返回双亲指针,直接拿过来用不就完了。
Flammable_ice 2014-07-17
  • 打赏
  • 举报
回复
1.您首先提到了要在O(h)时间内找到p指针,所以删除操作也要在O(h)时间内找到p指针。 2.
引用
(先找到子树的最右侧叶子,然后取其后继)。
若右子树为空,那么还要分两种情况讨论,如果x->p->left=x(x是左孩子)说明有后继,后继就是x的父亲结点。如果x->p->right=x(x为右孩子)说明x没有后继,这是给后继赋值为空。 3.删除操作我还未细想。。
zhy___zhy 2014-07-16
  • 打赏
  • 举报
回复
这道题目中文版翻译有错。查看英文原版后可知,题目原意为“将二叉树的parent指针替换为successor指针”,即新的节点有左子树、右子树和后继节点三个指针。 使用这三个指针,可以在O(h)时间内找到节点的parent指针(先找到子树的最右侧叶子,然后取其后继)。 搜索和插入操作本身不需要parent指针,因此所需时间不变仍为O(h),但是插入时需要考虑对successor指针的维护,也是O(h),因此总时间为O(h)。 删除操作比较麻烦,不过应该只需要用到常数次找parent节点的操作,因此这方面是O(h),但是需要更新被删除元素的前驱节点的后继指针,“找前驱节点”这个操作好像不一定是O(h),当前驱节点在当前节点祖父的位置时?期待讨论~

33,019

社区成员

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

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