1.二叉排序树(二叉搜索树)
定义:二叉排序树或者是一棵空树或者是具有如下性质的二叉树
1)若左子树非空,则左子树上的结点均小于根结点的值。
2)若右子树非空,则右子树上的结点均大于根节点的值。
3)左右子树也分别为二叉排序树。
二叉排序树结点结构:
typedef struct node { KeyType key;//关键字的值 struct node *lchild,*rchild; }BSTNode,*BSTree;
2.二叉排序树的插入
插入思想:
1)若二叉排序树是空树,则key称为二叉排序树的根。
2)若二叉排序树非空,则将key与二叉排序树的根进行比较。
a.如果key的值等于根节点的值,则停止插入。
b.如果key的值小于根节点的值,则将key插入到左子树。
c.如果key的值大于根节点的值,则将key插入到右子树。
二叉排序树插入的递归算法:(这里的KeyType以int为例)
void InsertBST(BSTree bst,int key) { BSTNode *s; if(bst==nullptr) { s = (BSTNode *)malloc(sizeof(BSTNode)); s->key = key; s->lchild = nullptr; s->rchild = nullptr; bst = s; }else if(key<bst->key) { InsertBST(bst->lchild,key); }else if(key>bst->key) { InsertBST(bst->rchild,key); } }
3.二叉树的查找
查找思想:
首先将带查找的关键字与根节点关键字t进行比较,如果:
1)key = t,返回根节点的地址
2)key < t,进一步查找左子树
3)key > t,进一步查找右子树
代码:
BSTNode * SearchBST(BSTree bst,int key) { if(!bst) return nullptr;//空树 else if(bst->key==key) return bst; else if(bst->key>key) return SearchBST(bst->lchild,key); else if(bst->key<key) return SearchBST(bst->rchild,key); }
4.二叉排序树的删除
删除一个结点,不能以该结点为根的子树一起删除。
删除思想:
首先要查找要删除的结点是否在该二叉排序树中,如不在不做任何操作,否则假设要删除的结点为p,结点p的双亲结点为f。
并假设结点p是结点f的左孩子(右孩子类似)。
1)若p为叶节点,则可直接将其删除:f->lchild = nullptr;free(p);
2) 若p结点只有左子树,或只有右子树,则可将p的左子树或者右子树,直接改为其双亲结点的左子树。即
f->lchild=p->lchild(或f->lchild = p->rchild).
3) 若p既有左子树又有右子树,首先找到p结点在中序序列中的前驱节点s结点,然后将p的左子树改为f的左子树,将p的右子树改为s的右子树:f->lchild=p->lchild;s->rchild=p->rchild;free(p);