懒猫老师-数据结构-(58)二叉排序树的删除(二叉查找树)_哔哩哔哩_bilibili
概念
(1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
(3)它的左右子树也都是二叉排序树。
通过递归的方法来定义
中序遍历二叉排序树可以得到一个按关键码有序的序列。
操作
创建二叉树
// 定义二叉查找树的节点
typedef struct Node { int key; struct Node* left; struct Node* right;
} Node;
插入操作
Node* insert(Node* node, int key) { if (node == NULL) return newNode(key); if (key < node->key) { node->left = insert(node->left, key); } else if (key > node->key) { node->right = insert(node->right, key); } return node;
}
也可用循环进行多次插入
查找操作
// 查找特定键值
Node* search(Node* root, int key) { if (root == NULL) { return NULL; } if (key == root->key) { return root; } if (key < root->key) { return search(root->left, key); } return search(root->right, key);
}
删除操作(重要)
1、删除节点为叶子结点
直接删除
2、被删除的节点只有左子树或只有右子树
3、被删除的节点既有左子树又有右子树
以左子树中最大的节点或右子树中最小的节点替代被删除的节点