一、二叉排序树的创建
void BuildTree(Tree* root,int k)
{
Tree* S = Creatnode(k);//创建一个节点
for (int i = 0; i <= k; i++)
{
if (num[k] > root->data)//如果该节点的值大于根节点,就往右边走。
{
if (root->right == NULL)
{
root->right = S;
return;
}
else
root = root->right;
}
else
{
if (root->left == NULL)//如果节点的值小于根节点,就往左边走
{
root->left = S;
return;
}
else
root = root->left;
}
}
}
二、节点的删除
Tree* find(Tree* root)
{
Tree* current = root;
while(current->right != NULL)
current = current->right;
return current;
}
Tree* Deletes(Tree* node, int deletenum)
{
if (node == NULL)//如果node 是NULL 就返回
return node;
//比较根节点的值与deletenum的值来判断是往左走还是右走
if (deletenum < node->data)
node->left = Delete(node->left, deletenum);
else
{
if (deletenum > node->data)
node->right = Delete(node->right, deletenum);
else
{
if (node->left == NULL)//如果删除节点的左子树为空,就将右子树赋给被删除节点的parent节点
{
Tree* temp = node->right;
return temp;
}
else
{
if (node->right == NULL)//同理
{
Tree* temp = node->left;
return temp;
}
}
//这里是左右子树都不为空,那就用前驱代替
Tree* successor = find(node->left);
node->data = successor->data;
node->left = Delete(node->left, successor->data);//注意这里是node->left
}
}
return node;
}
如果要用后继节点代替,只需要把find()函数修改一下,然后传入的数据改成node->right就行