一、二叉排序树:
1、基本概念:(1)若左子树不空,则左子树上的所有节点的关键字值均小于根节点的关键字值;(2)若若右子树不空,则右子树上的所有节点的关键字值均大于等于根节点上的关键字值(3)左右字数也均为二叉排序树。
二叉排序树通常采用二叉链表存储结构。二叉排序树中的节点的结构体定义如下:
typedef struct node { DataType data; struct node* leftchild; struct node* rightchile; }biTreeNode;
二叉排序树上的主要操作是:查找,插入,删除等操作。
2、二叉排序树的查找算法:
二叉树的查找算法就是遍历二叉排序树并在排序中,寻找要查找数据元素是否存在的过程。在二叉排序树上查找某个数据元素是否存在的算法也有循环结构和递归结构算法两种。
int search(bitreenode * root, datatype item) { bitreenode * p; if(root! = NULL){ p =root; while(p!=NULL) { if(p->data.key == item.key)return 1;//查找成功 if(item.key>p->data.key)p=p->rightchile; else p=p->leftchild; } } return 0;//查找失败 }
3、二叉排序树的插入算法:
先判断要插入元素是不是已经存在于二叉排序树中,若已经存在,就不再插入。若不存在则把该数据元素插入到二叉排序树上查找失败时节点的做指针或右指针上。因此,二叉排序树上的插入过程首先是一个查找过程。:这个查找过程,要求同时记住当前节点的位置,因为当查找不到该数据元素时候,插入的过程就是把该数据元素节点地址赋值给查找失败时当前节点的左指针或右指针。
1 int insert(bitreenode** root, datatype item) 2 { 3 bitreenode* current, *parent = NULL, *p; 4 current = *root; 5 while (current!= NULL) 6 { 7 if (current->data.key == item.key)return 0;//数据元素已经存在 8 parent = current; 9 if (current->data.key < item.key)current = current->rightchild; 10 else current = current->leftchild; 11 } 12 p = (bitreenode *)malloc(sizeof(bitreenode)); 13 if (p == NULL) 14 { 15 cout << "空间不够" << endl; 16 exit(1); 17 } 18 19 //生成新的节点 20 p->data = item; 21 p->leftchild = NULL; 22 p->rightchild = NULL; 23 24 if (parrent == NULL)*root = p; 25 else if (item.key < parent->data.key) 26 parent->leftchild = p; 27 else 28 parent->rightchild = p; 29 return 1; 30 }
调用二叉排序树上的插入算法就可一构造出一个二叉排序树。
4、二叉排序树的删除算法:
同理:首先判断数据元素是否在二叉排序树中存在,若不存在则返回,若存在则删除:
(1)要删除的节点无孩子节点
(2)要删除的节点只有左孩子节点
(3)要删除的节点只有右孩子节点
(4)要输出的节点右左右孩子节点
对应上述情况,相应的删除算法是:
(1)要删除的节点无孩子节点时候,直接删除该节点。
(2)要删除的节点只有左孩子节点时候,删除该节点且使被删除节点的双亲指向被删除的节点的左孩子节点
(3)要删除的节点只有右孩子节点时候,删除该节点且使被删除节点的双亲指向被删除的节点的右孩子节点
(4)要删除的节点右左右孩子节点时候,分三步完成,首先,寻找数据元素的关键字值大于要删除节点数据元素关键字的最小值,就是寻找要删除节点右子树的最左节点;然后把右子树的最左节点拷贝到要删除的节点上;最后删除右子树的最左节点。