本次的课程设计要求建立一颗二叉树,并且用中序非递归方法遍历该二叉树,然后判断该二叉树是否为二叉排序树,如果是二叉排序树的话进一步要求对结点进行插入和删除操作,并输出操作后的结果。
树结点
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);
}
}
接下来我们要判断这颗二叉树是不是排序二叉树,算法的思想为:先对二叉树进行一次中序遍历,并且将遍历结果存储到数组中,复制该数组然后用快速排序对其进行升序排序,再比较排序