#include <iostream> using namespace std; //树节点 struct Node { int element; Node *pLeft; Node *pRight; Node(int ele, Node *left = NULL, Node *right = NULL) :element(ele), pLeft(left), pRight(right){} }; //插入操作 Node *InserNode(Node *root, int ele) { if (NULL == root) root = new Node(ele); else if (ele < root->element) root->pLeft = InserNode(root->pLeft, ele); else root->pRight = InserNode(root->pRight, ele); return root; } //中序输出 void MiddlePrint(Node *root) { if(NULL == root) return; else { MiddlePrint(root->pLeft); cout<<root->element<<" "; MiddlePrint(root->pRight); } } //获取元素ele节点的指针 Node* GetPointer(Node* root, int ele) { while(root != NULL) { if(root->element > ele) root = root->pLeft; else if (root->element < ele) root = root->pRight; else break; } return root; } //获取节点node的父节点(根节点的父节点为null) Node* GetParent(Node *root, Node *node) { Node *res = NULL; while (root != NULL) { if(root->element > node->element) { res = root; root = root->pLeft; } else if (root->element < node->element) { res = root; root = root->pRight; } else break; } return res; } //获取最小的节点 Node* GetMin(Node *root) { Node *res = root; while (root!= NULL) { res = root; root = root->pLeft; } return res; } //删除节点node void DeleteNode(Node* &root, Node *node) { if(root == NULL) return; if ((node->pLeft != NULL) && (node->pRight != NULL)) //有2个子节点 { Node *min = GetMin(node->pRight); //node右子树的最小节点 node->element = min->element; DeleteNode(node->pRight, min); } else //0个或1个节点 { Node *parent = GetParent(root, node); //获得父节点 Node *child = NULL; //找儿子节点 if(node->pLeft != NULL) child = node->pLeft; else if(node->pRight != NULL) child = node->pRight; if(parent->element < node->element) // 交换指针删除节点 parent->pRight = child; else if(parent->element > node->element) parent->pLeft = child; } } int main() { Node *root = NULL; int arr[] = {10, 4, 16, 8, 1, 12, 15, 5, 23, 17}; int size = sizeof(arr) / sizeof(*arr); for (int i = 0; i<size; i++) root = InserNode(root, arr[i]); MiddlePrint(root); cout<<endl; cout<<GetMin(root)->element<<endl; Node *p = GetPointer(root, 10); DeleteNode(root, p); MiddlePrint(root); return 0; } 分情况: (1)若节点有2个函数,那么将右子树的最小值放到该节点位置,对其右字数进行删除,同时将情况变为(2). (2)若有0或1个节点,那么直接通过变换指针来删除该节点。