#1. 代码段1 简介:二叉搜索树建立的类
## 1.1
'''
template<class T>//1
class sortBinTree;//2
template<class T>//3
class sortBinTreeNode//4
{
friend class sortBinTree<T>;//5
private://6
sortBinTreeNode<T> *left;//7
sortBinTreeNode<T> *right;//8
T data;//9
public://10
sortBinTreeNode():left(NULL),right(NULL){}//11
sortBinTreeNode(T d):data(d),left(NULL),right(NULL){}//12
T getData(){return data;}//13
};
template<class T>//14
class sortBinTree//15
{
public://16
sortBinTreeNode<T> *root;//17
public://18
sortBinTree(sortBinTreeNode<T> *ptr = NULL):root(ptr){}//19
public://20
//注意这个插入函数一定要有返回值,否则相当于没插进去
int insert_val(T &x){return insert_val(root,x);}//21
T max(){return max(root);}/22
T min(){return min(root);}//23
//这里的sort就相当于中序遍历。因为排序树中序遍历就是从小到大的。
void sort(){sort(root);}//24
int remove(T key){return remove(root,key);}//25
sortBinTreeNode<T>* find(T x){return find(root,x);}//26
'''
## 1.2 不懂的地方
第3行到第20行,对语法不懂,略微查询过c++ class类的意思,但是看到实际的代码后还是觉得不太能理解,不明白为什么要这么写,不明白为什么这么写的好处是什么。
自己对代码的粗略分析:这里定义了一种类,类中public 的函数是类里面的大家都可以访问的函数,在类里面只是这个函数的声明,并不给出实现的代码。
#2 代码段2 简介 :二叉搜索树各类别操作的实现
##2.1
'''
sortBinTreeNode<T>* find(sortBinTreeNode<T> *t,T key)
{
if(t == NULL)//1
return NULL;//2
else if(t->data == key)//3
return t;//4
else if(t->data > key)//5
return find(t->left,key);//6
else//7
return find(t->right,key);//8
}
int remove(sortBinTreeNode<T> *&t,T key)//9
{
if(t == NULL)//10
return FALSE;//11
if(key < t->data)//12
remove(t->left,key);//13
else if(key > t->data)//14
remove(t->right,key);//15
else//16
{
sortBinTreeNode<T> *p = NULL;//17
if(t->left != NULL && t->right != NULL)//18
{
p = t->left;//19
while(p->right != NULL)//20
p = p->right;//21
t->data = p->data;//22
remove(t->left,p->data);//23
}
else//24
{
p = t;//25
if(t->left == NULL)//26
t = t->right;//27
else
t = t->left;//28
delete p;//29
return TRUE;//30
}
}
}
T min(sortBinTreeNode<T> *p)//31
{
if(p != NULL)//32
{
while(p->left != NULL)//33
p = p->left;//34
return p->data;//35
}
}
T max(sortBinTreeNode<T> *p)//36
{
if(p != NULL)//37
{
while(p->right != NULL)//38
p = p->right;//39
return p->data;//40
}
}
int insert_val(sortBinTreeNode<T> *&p,T &x)//41
{
if(p == NULL)//42
{
p = new sortBinTreeNode<T>(x);//43
assert(p != NULL);//44
return OK;//45
}
else if(p->data > x)//46
{
insert_val(p->left,x);//47
}
else if(p->data < x)//48
{
insert_val(p->right,x);//49
}
else
return ERROR;//50
}
'''
## 2.2 自己不懂得地方
第1-30行,对功能如何实现的理解存在一些障碍,原因来自于对递归写法的不熟练,递归思想不够,看到需要频繁递归实现的函数都需要较长的时间才能理解代码所展示的意思。
对该段代码的粗略分析:第一个函数是为了找出需要修改的节点,因此第一个函数用来配套第二个remove删除函数使用,删除函数。在删除函数中,如果要删除的结点为叶结点,那么直接删除,如果不是叶结点,那么有两种方法,一种找到左子树中最大的结点,使其替代掉原来要删除的结点,并将原先的那个最大结点位置删除;第二种方法则是找到右子树中的最小结点,然后同样替代要删除的结点,然后删除原本最小结点所在位置。(二叉搜索树是是左结点都小于根结点,右结点都大于根结点)
第41-50行,原因同样是因为对递归思想的不熟悉,可以理解代码想表达的意思和功能,但是自己尝试去写这样的代码的时候会碰到各种各样的问题,思路不够清晰。
代码的分析:使用的是插入操作,运用递归的方法,找到适合想要插入结点插入的位置,并将其成功放置。
## 3. 有一些自己的疑问
**如何用堆栈将递归改写?**
**如果数据十分庞大,那么一直使用递归的调用会不会出现空间不足而出错的问题呢?**