感谢:爱你是长久之计~博主提供思想(私下,技术交流)
利用循环删除二叉搜索树算法-算法流程图

利用循环删除二叉搜索树算法-算法实现
Tree::Tree_Node* Loop_FindTreeNode(Tree::Tree_Node*& root, const Tree::Tree_value &value) {
auto currentNode = root;
while (currentNode&& currentNode->value != value){
if ((currentNode->value> value)){
currentNode = currentNode->LeftChild;
}
else {
currentNode = currentNode->RightChild;
}
}
return currentNode;
}
Tree::Tree_Node* Loop_FindTreeParentNode(Tree::Tree_Node*& node, const Tree::Tree_value& value) {
Tree::Tree_Node* Parent = nullptr;
auto currentNode = node;
while (currentNode && currentNode->value != value) {
Parent = currentNode;
if ((currentNode->value > value )) {
currentNode = currentNode->LeftChild;
}
else {
currentNode = currentNode->RightChild;
}
}
return currentNode != nullptr ? Parent : nullptr;
}
int *Loop_FindTreeMaxOrMinValue(Tree::Tree_Node*& node) {
int* MaxOrMinValue = nullptr;
auto currentNode = node;
if (currentNode){
if (currentNode->LeftChild) {
currentNode = currentNode->LeftChild;
while (currentNode->RightChild) {
currentNode = currentNode->RightChild;
}
MaxOrMinValue = ¤tNode->value;
}
else if (currentNode->RightChild){
currentNode = currentNode->RightChild;
while (currentNode->LeftChild) {
currentNode = currentNode->LeftChild;
}
MaxOrMinValue = ¤tNode->value;
}
}
return MaxOrMinValue != nullptr ? MaxOrMinValue : nullptr;
}
inline bool Is_TreeNodeSame( Tree::Tree_Node*& treeNodeOnce, Tree::Tree_Node*& treeNodeTwo) {
return (treeNodeOnce == treeNodeTwo);
}
void unlinkTreeNodeLeftChild(Tree::Tree_Node*& TargetNode, Tree::Tree_Node* SourceNode = nullptr) {
TargetNode ? TargetNode->LeftChild = SourceNode : TargetNode;
}
void unlinkTreeNodeRightChild(Tree::Tree_Node*& TargetNode, Tree::Tree_Node* SourceNode = nullptr) {
TargetNode ? TargetNode->RightChild = SourceNode : TargetNode;
}
void Destroy_treeNode(Tree::Tree_Node*& TreeNode, nullptr_t where=nullptr) {
delete TreeNode;
TreeNode = where;
}
bool Loop_DeleteTreeNode(Tree::Tree_Node*& root, const Tree::Tree_value& value) {
bool ret = false;
Tree::Tree_Node* currentNode = Loop_FindTreeNode(root, value);
Tree::Tree_Node* currentParentNode = Loop_FindTreeParentNode(root, value);
ret = currentNode;
if (ret) {
if (!currentNode->LeftChild && !currentNode->RightChild) {
if (!Is_TreeNodeSame(currentNode, root)) {
if (currentParentNode) {
if (Is_TreeNodeSame(currentParentNode->LeftChild, currentNode)) {
unlinkTreeNodeLeftChild(currentParentNode);
}
else {
unlinkTreeNodeRightChild(currentParentNode);
}
}
}
else {
Destroy_treeNode(currentNode);
root = currentNode;
}
Destroy_treeNode(currentNode);
}
else if (currentNode->LeftChild && !currentNode->RightChild) {
if (!Is_TreeNodeSame(currentNode, root)) {
if (currentParentNode) {
if (Is_TreeNodeSame(currentParentNode->LeftChild, currentNode)) {
unlinkTreeNodeLeftChild(currentParentNode, currentNode->LeftChild);
}
else {
unlinkTreeNodeRightChild(currentParentNode, currentNode->LeftChild);
}
}
}
else {
root = root->LeftChild;
}
Destroy_treeNode(currentNode);
}
else if (!currentNode->LeftChild && currentNode->RightChild) {
if (!Is_TreeNodeSame(currentNode, root)) {
if (currentParentNode) {
if (Is_TreeNodeSame(currentParentNode->LeftChild, currentNode)) {
unlinkTreeNodeLeftChild(currentParentNode, currentNode->RightChild);
}
else {
unlinkTreeNodeRightChild(currentParentNode, currentNode->RightChild);
}
}
}
else {
root = root->RightChild;
}
Destroy_treeNode(currentNode);
}
else {
const int* MaxOrMinValue = Loop_FindTreeMaxOrMinValue(currentNode);
ret = MaxOrMinValue;
if (ret) {
auto CacheNode = Loop_FindTreeNode(root, *MaxOrMinValue);
auto CacheNodeParent = Loop_FindTreeParentNode(root, *MaxOrMinValue);
ret = CacheNodeParent;
if (ret){
currentNode->value = *MaxOrMinValue;
if (CacheNodeParent->LeftChild == CacheNode) {
if (CacheNode->RightChild && !CacheNode->LeftChild) {
unlinkTreeNodeLeftChild(CacheNodeParent, CacheNode->RightChild);
}
else {
unlinkTreeNodeLeftChild(CacheNodeParent);
}
}
else if (CacheNodeParent->RightChild == CacheNode) {
if (CacheNode->LeftChild && !CacheNode->RightChild) {
unlinkTreeNodeRightChild(CacheNodeParent, CacheNode->LeftChild);
}
else {
unlinkTreeNodeRightChild(CacheNodeParent);
}
}
Destroy_treeNode(CacheNode);
}
}
}
}
return ret;
}
void TreeErase(Tree& tree, const Tree::Tree_value& value) {
Loop_DeleteTreeNode(tree.Root, value);
tree.size -= 1;
}