您的位置:首页 > 编程语言 > C语言/C++

细节决定成败: 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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: