关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“C小加”写的很详细了,我主要补充二叉树的删除操作。删除操作主要难在对左右子节点都非空的节点的删除操作,这里可以找到该节点右节点中的最小值,即右子节点中的最左子树。找到后和需要删除的节点交换data等数据,然后删除这个最小子节点。实现代码如下,只需对需要删除节点的右子节点遍历一次:
template<class T> void BST<T>::Deletepri(TreeNode<T> *&node, T x) { if(node == NULL) return; if(x > node->data) { Deletepri(node->rson, x); } else if(x < node->data) { Deletepri(node->lson, x); } else { if(node->lson!=NULL && node->rson!=NULL) { TreeNode<T> *temp = node->rson; TreeNode<T> *pre_node= NULL; TreeNode<T> *temp_node= NULL; while(temp->lson != NULL) { pre_node = temp; temp = temp->lson; } node->data = temp->data; node->freq = temp->freq; temp_node = temp->rson; delete temp; pre_node->lson = temp_node; return; } else { TreeNode<T> *temp = node; if(node->lson == NULL) node = node->rson; if(node->rson == NULL) node = node->lson; delete temp; } } return ; } template<class T> void BST<T>::Delete(T x) { Deletepri(root, x); }
代码没有进行很多测试,应该有bug,欢迎指正。
时间: 2024-10-08 10:29:30