正在上数据结构的课程
感觉平衡二叉树很有对称的美感
所以决定首篇博客献给平衡二叉树
平衡二叉树其实是二叉排序树的一种提升
——那么什么是二叉排序树
简单的讲,就是对于二叉排序树的每个节点,其左孩的值<该节点的值<右孩的值,且二叉排序树所有节点的值不重复。
如此一来,对二叉排序树进行LDR遍历的输出,便是一个递增的序列,也就是所谓的二叉“排序”树。
由于这种有序的特点,那么查找树中的一个元素的时候,便可以产生类似“折半查找法”的效果:
1)折半查找法要求的就是一个有序的序列,二叉排序树对应的也是一个有序的序列。
2)对于要查找的元素elem
bool FindElem(BinarySortTreeNode * node,ElemType elem)
{
if(node != NULL)
{
if(node->data == elem)//找到元素
return true;
else if(node->data > elem)//只需继续查找左子树
return FindElem(node->LeftChild, elem);
else if(node->data < elem)//只需继续查找右子树
return FindElem(node->RightChild, elem);
}
else return false;
}
所以二叉排序树又称为二叉搜索树
——为什么说是“类似”折半查找:
这和二叉排序树的建立有关。由于二叉排序树的特点,新加入的元素newElem要符合二叉排序树的有序状态,所以插入的时候
bool AddElem(BinarySortTreeNode*& node, ElemType newElem)
{
| if(node != NULL)//当node非空
| {
| | if(node->data == newElem)//已存在这个元素
| | return false;
| | else if(node->data > newElem)//按规则插入node左边
| | return AddElem(node->LeftChild, newElem);
| | else if(node->data < newElem)//按规则插入node右边
|