#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define N 100
char ch;
int a[N];
int n;
double ASL;
int root,x,sum,result;
struct node
{
int value,left,right, dep, fa;
}BST[N];
void setRightchild(int p,int x)
{
BST[++n].value = x;
BST[n].fa = p;
BST[p].right = n;
BST[n].dep = BST[p].dep + 1;
}
void setLeftchild(int p, int x)
{
BST[++n].value = x;
BST[n].fa = p;
BST[p].left = n;
BST[n].dep = BST[p].dep + 1;
}
int Search(int x)//在二叉查找树中查找值为x的节点
{
int p = root;
while (p != 0)
{
if (x > BST[p].value)
p = BST[p].right;
else if (x < BST[p].value)
p = BST[p].left;
else return p;
}
return -1;
}
void Insert(int x)//在二叉查找树中插入值为x的节点
{
if (Search(x)!=-1) return ;
if (root == -1)//如果当前的树为空
{
BST[++n].value = x;
root = n;
BST[n].dep = 1;
BST[n].fa = 0;
return ;
}
int p = root, q;
while (p!=0)//如果当前的树不为空
{
q = p;
if (x > BST[q].value) p = BST[p].right;
else p = BST[p].left;
}
if (x > BST[q].value) setRightchild(q,x);
else setLeftchild(q,x);
}
void InOrder(int p)//对二叉查找树进行中序遍历
{
if (p == 0) return ;
InOrder(BST[p].left);
printf("%d ", BST[p].value);
InOrder(BST[p].right);
}
void Delete(int p)//从二叉查找树中删除编号为p的节点
{
int p1 = p, child, parent = BST[p].fa;
if (BST[p].left && BST[p].right)//若左右子树均非空
{
parent = p;
p = BST[p].right;
while (BST[p].left)//找右子树中的最小值
{
parent = p;
p = BST[p].left;
}
}
child = BST[p].left ? BST[p].left : BST[p].right;
if (!parent)
root = child;//如果双亲为空,说明p为根
else
{
if (BST[parent].left == p) BST[parent].left = child;//如果p是双亲结点的左孩子
else BST[parent].right = child;
}
if (p1 != p) BST[p1].value = BST[p].value;//情况(3)
}
int main()
{
root = -1;
memset(BST,0,sizeof(BST));
printf("Please input the numbers you want to build the BST\n");
while (1)
{
scanf("%d", &x);
Insert(x);//建立二叉查找树
scanf("%c", &ch);
if (ch == '\n') break;
}
printf("The InOrder is:\n");
InOrder(root);//对二叉查找树BST进行中序遍历
printf("\n");
sum = 0;
for (int i=1;i<=n;i++)
sum += BST[i].dep;
ASL = (double)sum / (double)n;
printf("ASL = %.6f\n", ASL);
printf("Please input a number x for search\n");
scanf("%d", &x);
result = Search(x);
if (result == -1)
printf("无x\n");
else
{
Delete(result);
printf("The InOrder of BST after deleting x is:\n");
InOrder(root);
printf("\n");
}
}
zzz
最新推荐文章于 2020-07-17 20:53:06 发布