ree(struct BTreeNode** BT)//清除二叉树,使之变为一棵空树 { if (*BT != NULL) { ClearBTree(&((*BT)->left));//删除左子树 ClearBTree(&((*BT)->right));//删除右子树 free(*BT); //释放根结点 *BT = NULL; //置根指针为空 } } //主函数 void main()//其中用到二叉树操作的函数都基本没变,只是元素类型换为int { int x, *px; ElemType a[10] = {30,50,20,40,25,70,54,23,80,92}; struct BTreeNode* bst = NULL; CreateBSTree(&bst, a, 10); //利用数组a建立一棵树根指针为bst的二叉搜索树 printf("建立的二叉搜索树的广义表形式为:\n"); PrintBTree_int(bst); printf("\n"); printf("中序遍历:\n"); Inorder_int(bst); printf("\n"); printf("输入待查找元素值:"); scanf(" %d", &x);//格式串中的空格可以跳过任何空白符 if (px = Find(bst, x)) printf("查找成功!得到的x为:%d\n", *px); else printf("查找失败!\n"); printf("输入待插入元素值:"); scanf(" %d", &x); Insert(&bst, x); printf("输入待插入元素值:"); scanf(" %d", &x); Insert(&bst, x); printf("输入待插入元素值:"); scanf(" %d", &x); Insert(&bst, x); printf("进行相应操作后的中序遍历为:\n"); Inorder_int(bst); printf("\n"); printf("输入待删除元素值:"); scanf(" %d", &x); if (Delete(&bst, x)) printf("1\n"); else printf("0\n"); printf("进行相应操作后的中序遍历为:\n"); Inorder_int(bst); printf("\n"); printf("操作后的二叉搜索树的广义表形式为:\n"); PrintBTree_int(bst); printf("\n"); ClearBTree(&bst); }
运行结果:

分析:此程序的初始二叉搜索树如下:

然后依次插入:35,45,41 三个元素,插入后的二叉搜索树如下:

最后删除元素为50的结点,删除结点后的二叉搜索树如下:

删除结点前的中序遍历为:20,23,25,30,35,40,41,45,50,54,70,80,92
删除过程:
需要删除的结点是:元素为50的结点,此结点为双支结点,我们知道其中序前驱结点(中序序列中处于它前面的一个结点)为45,所以将45替换到50的位置,
而45结点有一个左孩子,45结点为单支结点,则直接将其后续结点(此处为左孩子41)替换原45结点的位置。删除完成。