二叉排序树的删除和查找可以用递归实现,也可以用循环实现。
1.查找
1.1查找值
bool search(tnode * root,int value)
{
(!root) FALSE;
while(root->data!=value)
.................
}
1.2 查找中序遍历的前缀或者后缀
node * search_node(tnode * root,int value)
思路同上,每次比较之后选择是->lchild,->rchild
2.删除
思路,找到前缀pre,删除思路根据节点拥有的的子树决定
2.1 分类
删除叶子:例如叶子是前缀的左子树,则pre->lchild=NULL。
删除只有左或右子树的节点:将节点的非空子树赋值给节点前缀的相应子树。这类删除退化成单链表的删除。
删除有左和右子树的节点:先取得要删除的节点,可以再取左子树的最大值,或右子树的最小值,将值取代要删除的值,然后将此节点删除。