基础的二叉搜索树

Binary Tree这种东西听到很多次了,然而总是觉得与它有些距离,可以平时的程序里没有涉及过这种工具,所以距离感一直保持着;我没有放弃CS106B的内容,于是跟着课程表下去,安排到阅读教材的第16章,Trees,于是我就花了半个小时,又看了一遍二叉搜索树的内容,然后自己写了个小程序测试一下自己的理解程度。

我其实对树的概念很熟悉了,毕竟在学校里学过离散数学和数据结构,所以如果你要让我在纸上画结构的话,我很快就能把东西呈现出来。但是用计算机实现的话还是有点难度,我前面的一篇文章写到了对递归的一些新认识,《抽象编程》这本书里提到的理解递归你需要一些recursive leap of faith,一个递归程序有正确的终止条件,正确的能够把问题规模降低的分解过程,你就可以认为它是可行的,我慢慢接受了这个信念,今天阅读和写程序过程中都运用了它。

首先一个结构体来构造二叉树:

typedef string elemType;
struct BSTNode {
    elemType key;
    BSTNode * lchild;
    BSTNode * rchild;
};

typedef后面的顺序我一开始搞反了,导致编译出来巨多问题,修改了一下就没事了,先现有类型,再是新类型!

然后用递归来实现搜索二叉树的搜索和插入功能:

BSTNode * search(BSTNode * & current, elemType key) {
    if (current == NULL)
        return NULL;
    if (key == current->key)
        return current;
    if (key < current->key) {
        return search(current->lchild, key);
    } else {
        return search(current->rchild, key);
    }
}

void insert(BSTNode * & current, elemType key) {
    if (current == NULL) {
        current = new BSTNode;
        current->key = key;
        current->lchild = NULL;
        current->rchild = NULL;
    } else {
        if (key < current->key) {
            insert(current->lchild, key);
        }
        if (key > current->key) {
            insert(current->rchild, key);
        }
    }
}

搜索结果是返回某个节点的指针,插入就没有返回值了,我觉得也没什么问题。最后我写了个主程序来测试整个结构,我打算先插入6个字符串,然后再搜索其中的一个,看输出是否是我想要的:

int main() {
    BSTNode *t;
    insert(t, "a");
    insert(t, "b");
    insert(t, "c");
    insert(t, "d");
    insert(t, "e");
    insert(t, "f");
    BSTNode *s = search(t, "e");
    cout << s->key << endl;
    return 0;
}

最后输出了个e,是我要的结果。

测试比较简单,所以题目为基础的xxxxxx嘛….

你可能感兴趣的:(数据结构)