基于树的查找法

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);

猜你喜欢

转载自www.cnblogs.com/xcxfury001blogs/p/11456789.html