【数据结构】二叉查找树

来源:互联网 发布:filter() 数组 编辑:程序博客网 时间:2024/05/22 00:20

二叉查找树


二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

树的节点定义如下:
#define keytype inttypedef struct BTreeNode{    struct BTreeNode* left;    struct BTreeNode* right;    struct BTreeNode* parent;    keytype value;}node,*pnode;

二叉查找树的插入

pnode TreeInsert(pnode T,keytype k){    pnode z = (pnode)malloc(sizeof(node));    z->left = NULL;    z->right = NULL;    z->parent = NULL;    z->value = k;    pnode x = T;    pnode y = NULL;    while(x!=NULL)    {        y = x;        if(k < x->value)            x = x->left;        else            x = x->right;    }    z->parent = y;    if(y==NULL)    {        T = z;    }    else    {        if(k < y->value)            y->left = z;        else            y->right = z;    }    return T;}

二叉查找树的删除

二叉树节点的删除要考虑的三种情况:
1.如果要删除的节点没有子女,则直接删除
2.如果要删除的节点只有一个子女,将其子女链接到父节点
3.如果要删除的节点有两个子女,则删除其后继节点
pnode TreeMinimum(pnode x){    while(x->left != NULL)        x = x->left;    return x;}pnode TreeSuccessor(pnode x){    if(x->right != NULL)        return TreeMinimum(x);    pnode y = x->parent;    while(y!=NULL && x==y->right)    {        x = y;        y = y->parent;    }    return y;}pnode TreeDelete(pnode T,pnode z){    pnode x,y;    if(z->left==NULL || z->right==NULL)        y = z;    else        y = TreeSuccessor(z);    if(y->left != NULL)        x = y->left;    else        x = y->right;    if(x != NULL)        x->parent = y->parent;    if(y->parent == NULL)        T = x;    else if(y == y->parent->left)        y->parent->left = x;    else        y->parent->right = x;    if(y != z)        z->value = y->value;    return y;}



0 0
原创粉丝点击