函数传参时,判断应传入指针还是指针的指针的依据:如果程序中不改变指针本身的值,只改变指针指向的值时传 *;如果程序中会改变指针本身的值则传 **
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
#define DATATYPE int
typedef struct NODE
{
DATATYPE data; //数据元素字段
struct NODE *lchild, *rchild; //左右指针字段
} NodeType;
/*
在二叉排序树*t上插入结点s
*/
void InsertNode(NodeType **t, NodeType *s)
{
if (*t == NULL) //若为空树
{
*t = s;
return;
}
if(s->data < (*t)->data) //若应插入左子树中,递归调用直到左子树为NULL
{
if((*t)->lchild != NULL)
{
InsertNode(&(*t)->lchild, s);
}
else
{
(*t)->lchild = s;
}
}
else //若应插入右子树中,递归调用直到左子树为NULL
{
if((*t)->rchild != NULL)
{
InsertNode(&(*t)->rchild, s);
}
else
{
(*t)->rchild = s;
}
}
}
/*
在二叉排序树t上查找关键码为key的元素,若找到,返回1,且*q指向该结点,*p指向其父结点;否则,返回0,且p指向查找失败前的最后一个结点
参数用**p和**q而不是用*p和*q是因为程序中会改变指针的值
*/
int SearchData(NodeType *bt, NodeType **p, NodeType **q, DATATYPE key)
{
*q = bt;
*p = bt;
int flag = 0;
while(*q)
{
if (key > (*q)->data) //key在右孩子上
{
*p = *q;
*q = (*q)->rchild;
}
else if (key < (*q)->data) //key在左孩子上
{
*p = *q;
*q = (*q)->lchild;
}
else //查找成功
{
flag = 1;
printf("%d %d\n", (*q)->data, (*p)->data);
break;
}
}
printf("%d\n", flag);
return flag;
}
int DeleteNode(NodeType **bt, DATATYPE key)
{
/*
由于当删除的结点为根结点时,会改变*bt的值,所以应传入指针的指针 **bt
判断应传入指针还是指针的指针依据:如果程序中不改变指针本身的值,改变指针指向的值时传 *,如果程序中会改变指针本身的值则传 **
*/
NodeType *p, *q, **f, *s;
int flag = 0;
if (SearchData(*bt, &p, &q, key))
{
flag = 1; //查找成功,置删除成功标志
if (p == q) //待删结点为根结点时
{
f = bt;
}
else if (key > p->data) //待删结点非根结点时
{
f = &(p->rchild);
}
else
{
f = &(p->lchild);
}
if (!q->rchild) //若待删除结点无右子树,以左子树替换待删除结点
{
*f = q->lchild;
}
else if (!q->lchild) //若待删除结点无左子树,以右子树替换待删除结点
{
*f = q->rchild;
}
else
{
p = q->rchild;
s = p;
while(p->lchild) //在右子树上寻找待删除结点的后继p
{
s = p;
p = p->lchild;
}
*f = p; //替换待删除结点q,重接左子树
p->lchild = q->lchild;
if (s != p) //待删除结点的右孩子有左子树时,还要重接右子树
{
s->lchild = p->rchild;
p->rchild = q->rchild;
}
}
free(q);
}
return flag;
}
/*
中序遍历输出
*/
void InOrder(NodeType *bt)
{
if (bt == NULL)
{
return;
}
InOrder(bt->lchild);
printf("%d ", bt->data);
InOrder(bt->rchild);
}
int main()
{
DATATYPE key = 0;
NodeType **sort = (NodeType **)malloc(sizeof(NodeType*));
*sort = NULL;
while(cin >> key)
{
//申请结点并赋值
NodeType *s = (NodeType *)malloc(sizeof(NodeType));
s->data = key;
s->lchild = NULL;
s->rchild = NULL;
InsertNode(sort, s);
}
InOrder(*sort);
printf("\n");
int temp = 42;
//scanf("%d", &temp);
printf("temp:%d\n", temp);
//SearchData(*sort, temp);
DeleteNode(sort, 63);
InOrder(*sort);
getch();
return 0;
}