细节决定成败: BST c和c++实现的区别
2013-09-27 17:42
288 查看
#include "BST.h"
// 理解了概念不一定能实现,有忽视的地方
//由于BST的叶子节点自然构成了一颗区间树,因此插入操作不会像平衡树或者红黑树那样麻烦,插入只需要插在叶子节点。
//因此对于任何一个元素,总可以唯一确定其在叶子节点的位置,即把null(nullb本来代表查找失败)替换成新插入的节点。
//注意:不存在要插入的节点位于两个节点之间的情况,不需要判断这种情况,只需要判断新插入的元素挂在当前叶子节点的左字数或者右子树
//node和BST要分开,采用compositin的design pattern
void BST::insert(char* word)// 可以用bool(*st)(ValueType,ValueType)来比较任意的value
{
BSTNode* current=Root;
// BSTNode* pnn=new BSTNode(word);
while(current!=NULL)// 没到叶子节点,循环结束current指针必然为null,而新分配的节点内存的地址未知,存储在指针变量中pnn中,如何将pnn作为current的孩子呢?循环完了current就成null了,因此必须要得存储,current上面的父亲
// 因此,更好的表示方法是:while(current!=NULL)
{
if(current->st(word)) //小于则进入左子树
{
probe=current->getLChildNode(*current); //!!!!!!!!!!! 不能用current=current->getLChildNode(*current),必须使要插入点的父亲节点指向该插入点
//由于插入点是新分配的内存,无法知晓插入点的内存地址,因此要保存插入点的父亲节点。
}
else
{
probe=current->getLChildNode(*current);
}
current=probe;//提前向前推一步,这样probe就存储了叶子节点的父节点。
}
// c语言的在bst中新建节点的实现方法是 **BSTNode pp=&probe;
// current=malloc();
// *pp=current;// 即用指针的指针来强行使while循环过程中的null赋值为新建的malloc地址
}
bool BST::find(char* word)
{
BSTNode* current=Root;
bool flag;
while(current!=NULL)
{
if(current->matchChar(word)) return true;
else if(current->st(word))
{
flag=current->getLChildNode(*current);
}
else
{
flag=current->getLChildNode(*current);
}
}
if(current==NULL) return false;
}
// 理解了概念不一定能实现,有忽视的地方
//由于BST的叶子节点自然构成了一颗区间树,因此插入操作不会像平衡树或者红黑树那样麻烦,插入只需要插在叶子节点。
//因此对于任何一个元素,总可以唯一确定其在叶子节点的位置,即把null(nullb本来代表查找失败)替换成新插入的节点。
//注意:不存在要插入的节点位于两个节点之间的情况,不需要判断这种情况,只需要判断新插入的元素挂在当前叶子节点的左字数或者右子树
//node和BST要分开,采用compositin的design pattern
void BST::insert(char* word)// 可以用bool(*st)(ValueType,ValueType)来比较任意的value
{
BSTNode* current=Root;
// BSTNode* pnn=new BSTNode(word);
while(current!=NULL)// 没到叶子节点,循环结束current指针必然为null,而新分配的节点内存的地址未知,存储在指针变量中pnn中,如何将pnn作为current的孩子呢?循环完了current就成null了,因此必须要得存储,current上面的父亲
// 因此,更好的表示方法是:while(current!=NULL)
{
if(current->st(word)) //小于则进入左子树
{
probe=current->getLChildNode(*current); //!!!!!!!!!!! 不能用current=current->getLChildNode(*current),必须使要插入点的父亲节点指向该插入点
//由于插入点是新分配的内存,无法知晓插入点的内存地址,因此要保存插入点的父亲节点。
}
else
{
probe=current->getLChildNode(*current);
}
current=probe;//提前向前推一步,这样probe就存储了叶子节点的父节点。
}
// c语言的在bst中新建节点的实现方法是 **BSTNode pp=&probe;
// current=malloc();
// *pp=current;// 即用指针的指针来强行使while循环过程中的null赋值为新建的malloc地址
}
bool BST::find(char* word)
{
BSTNode* current=Root;
bool flag;
while(current!=NULL)
{
if(current->matchChar(word)) return true;
else if(current->st(word))
{
flag=current->getLChildNode(*current);
}
else
{
flag=current->getLChildNode(*current);
}
}
if(current==NULL) return false;
}
相关文章推荐
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)
- C++中的虚函数(virtual function) (细节,决定成败) (写得很好)
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)
- C++中的虚函数(virtual function) (细节,决定成败)
- 【C/C++】细节决定成败
- 细节决定成败—字符数组&字符串区别
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)
- 集合和数组保存对象的引用变量(区别C++的STL实现)
- 算法复习-二叉搜索树BST的c++实现
- 心态决定细节,细节决定成败
- 细节决定成败——动作一定要做到位,才能强身健体
- 细节决定成败,宝马并不会比夏利多一个车轮
- 细节决定成败
- c++命名空间三种实现文件的区别
- [Java]Java区别于C/C++的细节笔记
- 细节决定成败
- 细节决定成败 一个HR给毕业生的面试黄金法则
- SEO细节决定成败 你做到了吗
- C++内联函数跟普通函数的区别以及实现机制
- 行动力决定了一个人的成败,有想法,就去做! C#的内存管理原理解析+标准Dispose模式的实现