细节决定成败: BST c和c++实现的区别

来源:互联网 发布:做淘宝客服流程 编辑:程序博客网 时间:2024/05/19 04:28
#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;
}

原创粉丝点击