• 大小: 5KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: C/C++
  • 标签:

资源简介

代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法

资源截图

代码片段和文件信息

#include 
#include 

typedef struct node
{
    int key;
    struct node *lchild*rchild;
}BSTNode;

//二叉排序树插入操作递归算法
BSTNode *InsertBST1(BSTNode *T int key)
{
    BSTNode *p *q = T;

    //p为待插入的新结点
    p = (BSTNode *)malloc(sizeof(BSTNode));
    p->key = key;
    p->lchild = p->rchild = NULL;

    if(T == NULL) //原树为空
        T = p; //新插入的结点为新的根

    //原树非空时将新结点p作为q的左孩子或右孩子插入
    else
    {
        if(key == q->key)
            return T;

        if(key < q->key)
        {
            if(q->lchild ==NULL)
                q->lchild = p;
            else
                InsertBST1(q->lchild key);
        }

        if(key > q->key)
        {
            if(q->rchild ==NULL)
                q->rchild = p;
            else
                InsertBST1(q->rchild key);
        }
    }
    return T;
}

////二叉排序树插入操作非递归算法
BSTNode *InsertBST2(BSTNode *T int key)
{
    BSTNode *f *p = T;

    //查找插入位置
    while(p)
    {
        if(key == p->key)
            return T;//无须插入

        f = p;//记录访问的结点
        if(key < p->key)
            p = p->lchild;
        else
            p = p->rchild;
        //若keykey,则在左子树中查找,否则在右子树中查找
    }

    //p为待插入的新结点
    p = (BSTNode *)malloc(sizeof(BSTNode));
    p->key = key;
    p->lchild = p->rchild = NULL;

    if(T == NULL) //原树为空
        T = p; //新插入的结点为新的根

    //原树非空时将新结点q作为p的左孩子或右孩子插入
    else
    {
        if(key < f->key)
            f->lchild = p;
        else f->rchild = p;
    }

    return T;
}

//二叉排序树删除操作
void DelBST(BSTNode *Tint key)
{
    BSTNode *p = T *f *q *s;
    while(p)
    {
        if(p->key == key) break; //找到关键字为key的结点
        f=p;//记下关键字key节点的父节点
        p=(key < p->key)? p->lchild : p->rchild;//分别在*p的左、右子树中查找
    }
    if(!p) return;//二叉排序树中无关键字为key的结点
    if(p->lchild == NULL && p->rchild == NULL)//p无左子树无右子树
    {
        if(p == T) T = NULL;//删除的是根节点
        else
            if(p == f->lchild)
                f->lchild = NULL;
            else
                f->rchild = NULL;
    }
    else if(p->lchild == NULL && p->rchild != NULL)//p无左子树有右子树
    {
        if(f->lchild == p)
            f->lchild = p->rchild;
        else
            f->rchild = p->rchild;
    }
    else if(p->rchild == NULL && p->lchild != NULL)//p有左子树无右子树
    {
  

评论

共有 条评论