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嘛….