搜索二叉树

来源:互联网 发布:c语言 java 编辑:程序博客网 时间:2024/05/20 19:48

搜索二叉树是一种严格执行“节点的值大于左子节点小于右子节点”这一规律的一种二叉树,而且其执行过程中是可以边插入边删除的。

但要注意,二叉搜索树中节点的左子树中所有节点的值都要小于该节点,同理,右子树中所有节点的值都要大于该节点。

下面是一种错误的搜索树:


因19大于祖先节点17

具体实现过程:

结构体:

typedef struct BinTree{    ElementType key;    struct BinTree *left, *right;}BinTree;

插入方法:

BinTree* Insert(BinTree *T, ElementType n){    if(!T)    {        BinTree *K = (BinTree*)malloc(sizeof(BinTree));        K->key = n;        K->left = NULL;        K->right = NULL;    }        if(T->key > n)    {        T->left = Insert(T->left, n);    }    else if(T->key < n)    {        T->right = Insert(T->right, n);    }        return K;}

删除方法:

删除二叉搜索树节点时,要注意删除的这个二叉树节点的左右子树。

有:1、该节点为叶子节点 2、该节点非叶子节点,有一个孩子节点 3、该节点非叶子节点,有左右孩子       三种情况。

1、当该节点为叶子节点时,无孩子节点,该节点可直接删除,但要注意其父亲节点相应指针的指向

2、当该节点只有一个孩子节点时,使该节点指向其孩子节点的地址,并释放该节点地址。

3、当该节点有两个孩子节点时,可以取该节点左子树中最大的值替换该节点的值删除那个左子树中最大值的节点,也可以取该节点右子树中最小的节点值来替换该节点的值同理,是删除那个右子树中最小节点。

具体实现:

BinTree* Delete(ElementType n, BinTree* T){    BinTree* mid = NULL;    if(!T)//该节点不存在    {        printf("没有找到该节点!\n");    }    else if(T->key > n)//该节点的值大于目标节点,需要遍历左子树寻找    {        T->left = Delete(n, T->left);    }    else if(T->key < n)//该节点的值小于目标节点,需要遍历右子树寻找    {        T->right = Delete(n, T->right);    }    else//找到该节点位置,根据节点情况处理    {        if(T->left&& T->right)//当节点有左子树和右子树的时候        {            mid = FindMin(T->right);                        T->key = mid->key;            T->right = Delete(mid->key, T->right);        }        else//当该节点仅有一个孩子或者没有孩子节点的时候        {            mid = T;            if(!T->left)//T有右孩子或无孩子节点,此时其右子节点或为空或为非空。            {                T = T->right;            }            else if(!T->right)//T有左孩子            {                T = T->left;            }            free(mid);        }    }    return T;}