以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 计算机考研交流 』 (http://bbs.xml.org.cn/list.asp?boardid=67) ---- 关于BST的递归问题 (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=37692) |
-- 作者:msychailce -- 发布时间:9/7/2006 4:33:00 PM -- 关于BST的递归问题 题目要求"规定二叉搜索树中重复关键码插入在右子树中,写出从一棵有重复关键码的BST中删除一个关键码的递归算法" 我写了下面的算法,但是当删除之后或是无此结点时递归跳回上一级函继续遍历,直到所有结点遍历完,做了很多无用功.想删除或找不到结点时结束函数该如何实现呢? 请高手指教 template<class T> void BinarySearchTree<T> Remove(T item,BinaryTreeNode<T> * root) { if(root == NULL) return; else if(item == (root->value()) { DeleteNode(root); //书中删除算法 if(root->rightchild()) { BinaryTreeNode<T> * temp = root->rightchild(); while((temp->leftchild())!=NULL) temp = temp->leftchild(); if((temp->value()) == item) { DeleteNode(temp); return; } else return; } else return; } else if(item < (root->value())) root = root->leftchild(); else root = root->rightchild(); }
|
-- 作者:mxf3306 -- 发布时间:9/7/2006 6:52:00 PM -- 最简单的方法是用个标志位,如果一旦开始删除,就置位,如果判断位被置上并且节点值不符合的话就退出。 |
-- 作者:mxf3306 -- 发布时间:9/7/2006 6:53:00 PM -- 还有就是找到结点后另用一个循环进行删除 |
-- 作者:msychailce -- 发布时间:9/8/2006 8:50:00 AM -- 嗯 加一个标志位返回时就可以一直return到根 看来我还是理解得不透啊 谢谢mxf3306兄 |
-- 作者:Supremgoooo -- 发布时间:9/9/2006 10:37:00 PM -- 递归?没看见呀!在哪?
|
-- 作者:msychailce -- 发布时间:9/11/2006 9:03:00 AM -- sorry,笔误,最后两个else下应该是Remove(root->leftchild()) 和Remove(root->rightchild()) 但是楼上加红的地方我不明白哪里错了,是删除重复结点,与root的右儿子有什么关系,不过我没考虑到有很多个重复的情况,应该加一循环 |
-- 作者:msychailce -- 发布时间:9/11/2006 4:31:00 PM -- 仔细想清楚了,这次应该对了. template<class T> void BinarySearchTree<T>::Remove(T item,Node<T> * root) { if(root == NULL) return; if(item < root->value()) Remove(root->leftchild()); if(root->value() == item) { DeleteNode(root); Remove(root->rightchild()); } if(item > root->value()) Remove(root->rightchild()); } 看看自己发帖时写的程序实在很烂,真惭愧啊~~ |
-- 作者:mxf3306 -- 发布时间:9/11/2006 5:56:00 PM -- 还有点小问题,参数不一致。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
62.500ms |