二叉排序树的实现

二叉排序树的实现

SearchBST(T,key)与InsertBST(T,key)的伪代码及其实现

SearchBST(T,key)

SearchBST(T,key)伪代码

SearchBST(T, key) {
    while (当T不为NULL时) {
        if (T的关键字 == key) {
            cout << "关键字存在,已找到。"
                return;
        }
        //当前结点不是关键字所在结点
        if (key < T的关键字)T = T->lchild;
        else T = T->rchild;
    }
    //循环结束都没有找到关键字
    cout << "关键字不存在"
}

SearchBST的实现

void SearchBST(BiTree T, ElemType key) {
	while (T) {
		if (T->key == key) {
			cout << "找到了关键字!" << endl;
			return;
		}
		else if (T->key > key) {
			T = T->lchild;
		}
		else {
			T = T->rchild;
		}
	}
	cout << "没有找到!" << endl;
}

InsertBST(T,key)

InsertBST(T,key)的伪代码

InsertBST(T, key) {
    while (T) {
        if (T的关键字 == key) {
            cout << "关键字存在,已找到。"
                return;
        }
        //当前结点不是关键字所在结点
        flag = T;//记住当前的结点

        if (key < T的关键字)T = T->lchild;
        else T = T->rchild;
    }
    //循环结束都没有找到关键字,可以插入
    p申请一块树结点大小的空间;
    p->key = key;
    if (T是一个空树)T = p;
    else {
        if (p->key < flag->key)p是上一个结点的左孩子;
        else p是上一个结点的右孩子;
    }
}

InsertBST(T,key)的实现

void InsertBST(BiTree* T, ElemType key) {
	BiTree T_copy = (*T);
	BiTree T_copy_parent = NULL;
	while (T_copy) {
		if (T_copy->key == key) {
			cout << "已有该关键字!" << endl;
			return;
		}

		T_copy_parent = T_copy;

		if (T_copy->key > key) {
			T_copy = T_copy->lchild;
		}
		else {
			T_copy = T_copy->rchild;
		}
	}

	T_copy = new BiTNode;
	T_copy->key = key;
	T_copy->lchild = T_copy->rchild = NULL;

	if ((*T) == NULL) (*T) = T_copy;
	else {
		if (T_copy->key > T_copy_parent->key)T_copy_parent->rchild = T_copy;
		else T_copy_parent->lchild = T_copy;
	}
}

CreateBST(T)的伪代码及其实现并创建及中序输出BST

CreateBST(T)的伪代码及其实现

CreateBST(T)的伪代码

CreateBST(T) {
	自定义key类型 key;
	cin >> key;
	while (key不为 - 1时) {
		InsertBST(&T, key);
		cin >> key;
	}
}
C++代码:
void CreateBST(BiTree& T) {
	ElemType key;
	T = NULL;
	cout << "请输入关键字:" << endl;
	cin >> key;
	while (key != -1) {
		InsertBST(&T, key);
		cin >> key;
	}
}

CreateBST(T)的实现

void CreateBST(BiTree& T) {
	ElemType key;
	T = NULL;
	cout << "请输入关键字:" << endl;
	cin >> key;
	while (key != -1) {
		InsertBST(&T, key);
		cin >> key;
	}
}

中序遍历

中序遍历InOrderTraverse(BiTree T)

void InOrderTraverse(BiTree T) {
	if (T) {
		InOrderTraverse(T->lchild);
		cout << T->key<<' ';
		InOrderTraverse(T->rchild);
	}
}

DeleteBST(T,key)的伪代码及其实现

DeleteBST(T,key)的伪代码

伪代码:
DeleteBST(T, key){
    while (T) {
		if (T->key == key) 跳出循环;
		
        flag=T//记录当前结点

		if (T_copy->key > key) 
            T_copy = T_copy->lchild;
		else T_copy = T_copy->rchild;
	}
    if(T==NULL)想删除的结点不存在,返回主函数;
    
    //若存在:
    if(T没有左子树) 右子树直接代替被删除的结点。
    else if(T没有右子树) 左子树直接代替被删除的结点
	else (左右子树均不空) {
        找到左子树中的最靠右的结点p代替被删节点;
        若p下还有孩子,则相当于“删除”了那个地方的结点,以上操作再来一次。
    }
}

DeleteBST(T,key)的实现

bool DeleteBST(BSTNode T, KeyType key)
{
	if (T == NULL)
	{
		return false;
	}
	else
	{
		if (key = T->data)
		{
			delete(T);
			return true;
		}
		else if (key < T->data)
		{
			return DeleteBST(T->lchild, key);
		}
		else
		{
			return DeleteBST(T->rchild, key);
		}
	}
}

删除关键字key的注意事项

  • 删除结点时不能把以该结点为根的子树全部删去
  • 删除后的二叉树要满足二叉排序树的性质
  • 二叉树在删除时必须先查找
  • 如果结点是叶子结点,那么直接删去
  • 如果非叶子结点要让下一个结点指向该结点前一个结点在删除
posted @ 2020-04-19 20:50  NiPShady  阅读(209)  评论(0编辑  收藏  举报