```cpp
//一年以前 不理解二叉树,写起来很费劲,现在不费吹灰之力
typedef struct BiTnode
{
int val;
struct BiTnode*lchild,rchild;
}BiTnode,*BiTree;
BiTree res; &res;
bool searchBST(BiTree root,int key,BiTree parent,BiTree *result)
{
if(root==NULL)
{
*result=parent;
return false;
}
else if(root->val==key)
{
*result=root;
return true;
}
else if(key<root->val)
{
searchBST(root->lchild,key,root,result);
}
else
{
searchBST(root->rchild,key,root,result);
]
}
//二叉排序树插入操作
bool insertBST( BiTree*root,int key)
{
BiTree res;
BiTree newnode;
if(!searchBST(root,key,NULL,&res))
{
newnode=(BiTree)malloc(sizeof(BiTree));
newnode->val=key;
#if 0
if(root==NULL)
{
*root=newnode;
return true;
}
else if(root->val>key)
{
}
else
{
}
这一步就不用自己再写判断了,就用searchBST的结果,res返回的
#endif
if(res==NULL)//说明没有找到,返回最后一个节点,而它还是NULL的,说明root==NULL,
{
*root=newnode;
return true;
}
else if(res->val<key)
{
res->rchild=newnode;
return true;
}
else
{
res->lchild=newnode;
return true;
}
}
else
{
return false;
}
}
1 1->left=*Node;1->right=3;
*node->2 3
(NODE) 4
NODE如果把2删除了,我让Node指向4即可
//注意二级指针的用法, node的父节点一直指向的是node这个值,比如是0x12345678这个地址,所以我如果删除node这个指向的值,只需让*Node指向它的左或者右孩子即可
void delete(BiTree *node)
{
if(root->lchild==NULL&&root->rchild==NULL)
{
free(node);
node=NULL;
}
else if(*node->lchild==null||*node->rchild==NULL)
{
#if 0
BiTree tmp=*node;
free(*node);
if(node->lchild==NULL)
tmp=node->rchild;
else
tmp=node->lchild;
#endif
BiTree q=*node;
if(*node->lchild==NULL)
node=(*node)->rchild;
else
node=(*node)->lchild;
free(q);
}
else
{
BiTree tmp=*node;
BiTree nextTmp=*node->lchild;
while(nextTmp->rchild)
{
tmp=nextTmp;
nextTmp=nextTmp->rchild;
}
*node->val=nextTmp->val;
if(tmp!=node)
{
tmp->rchild=nextTmp->lchild;
}
else
{/*
1 1是待删除的节点,tmp=1,nexttmp=2,2->rchild为空,所以tmp和1相等,直接把1的左子树连接到nexttmp的左子树上.
2
3*/
tmp->lrchild=nexttemp->lchild;//指针没有移动,
free(nextTmp);
}
}
}
//二叉排序树删除操作
bool deleteBST(BiTree*root,int key)
{
if(*root==NULL)
{
return false;
}
else if(*root->val<key)//
{
deleteBST(&(*root->rchild),key);
}
else if(root->val>key)
{
deleteBST(&(*root->lchild),key);
}
else (root->val==key)
{
delete(root);
}
return true;
}