9.3.2 二叉查找树

 三、二叉查找树的插入算法

  对于动态查找表,在查找不成功时尚需进行插入,即当二叉查找树中不存在其关键字等于给定值的结点时,需插入一个关键字定于给定值的数据元素。

  实际上,二叉查找树结构本身正是从空树开始逐个插入生成的。插入的原则为:若二叉查找树为空树,则插入的结点为新的根结点;否则,插入的结点必为一个新的叶子结点,其插入位置由查找过程确定。例如,若给定值序列为 { 50,30,40,80,20,36,90,40,38 },从空树起,逐个插入后构成的二叉查找树如右所示。

  插入算法如下所示。

算法 算法 9.6
  bool Insert BST(BiTree &T, ElemType e )
 {
  // 当二叉查找树T中不存在关键字等于 e.key 的数据元素时,
  // 插入 e 并返回 TRUE,否则返回 FALSE

  if (!SearchBST ( T, e.key, NULL, p ) { // 查找不成功
   s = new BiTNode;
   if (!s) exit(1);           // 存储分配失败
   s->data = e; s->lchild = s->rchild = NULL;
   if ( !p ) T = s;          // 插入 *s 为新的根结点
   else if ( e.key < p->data.key )
    p->lchild = s;           // 插入 *s 为 *p 的左孩子
   else p->rchild = s;         // 插入 *s 为 *p 的右孩子

   return TRUE;
  } // if
  else return FALSE;    // 树中已有关键字相同的结点,不再插入
 } // Insert BST
 

 动画 

 

  上面曾提及,由于对二叉查找树进行中序遍历得到的是一个有序序列,所以二叉查找树实质上是一个有序表。则由上述插入过程可见,可以通过生成一棵二叉查找树将一个"无序序列"变为一个"有序序列",由此二叉查找树又称"二叉排序树"。