【课程设计】判断二叉树是否为排序二叉树及排序二叉树节点的删除和插入算法

本次的课程设计要求建立一颗二叉树,并且用中序非递归方法遍历该二叉树,然后判断该二叉树是否为二叉排序树,如果是二叉排序树的话进一步要求对结点进行插入和删除操作,并输出操作后的结果。

树结点

typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    int data;
}BiTreeNode, *BiTree;

首先我们要建立一颗二叉树,这里我们采用二叉树的前序遍历序列和中序遍历序列递归地建立一颗二叉树,代码如下:

//二叉排序树测试用例
int pre[] = { 5, 3, 2, 4, 8, 6 };//前序遍历
int ino[] = { 2, 3, 4, 5, 6, 8 };//中序遍历
void BuildBTree(BiTreeNode **T, int preL, int preR, int inoL, int inoR)//递归建树
{
    if (preL>preR) return;
    int e = pre[preL];
    int root = inoL;
    while (ino[root] != e&&root <= inoR) ++root;
    (*T) = (BiTreeNode *)malloc(sizeof(BiTreeNode));
    (*T)->lchild = NULL;
    (*T)->rchild = NULL;
    (*T)->data = e;
    BuildBTree(&(*T)->lchild, preL + 1, preL + root - inoL, inoL, root - 1);
    BuildBTree(&(*T)->rchild, preL + root - inoL + 1, preR, root + 1, inoR);
}

然后定义中序非递归遍历函数,这里用辅助栈实现中序非递归遍历二叉树算法,代码如下:

void midvisit(BiTreeNode*root)
{
    //中序非递归遍历
    printf("中序遍历结果:");
    if (root)
    {
        BiTreeNode*Stack[100]; int top = -1;
        BiTreeNode*p;
        p = root;
        while (top != -1 || p)
        {
            while (p)
            {
                Stack[++top] = p;
                p = p->lchild;
            }
            if (top != -1)
            {
                p = Stack[top--];
                printf("%d", p->data);
                p = p->rchild;
            }
        }
    }
    putchar('\n');
}

为了便于对输出进行比较,顺便写了一个前序递归遍历函数,代码如下:

void previsit(BiTreeNode* t)
{
    if (t)
    {
        printf("%d", t->data);
        previsit(t->lchild);
        previsit(t->rchild);
    }
}

接下来我们要判断这颗二叉树是不是排序二叉树,算法的思想为:先对二叉树进行一次中序遍历,并且将遍历结果存储到数组中,复制该数组然后用快速排序对其进行升序排序,再比较排序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值