BST的插入、查找、删除操作均基于左小右大性质:插入递归至空位新增叶子;查找递归或迭代单路径比对;删除分三类——无子直接删、单子顶替、双子用中序前驱/后继替换并递归删。

二叉搜索树(BST)每个节点满足:左子树所有节点值
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
从根开始比较,小于当前节点往左走,大于往右走;遇到空位置就新建节点插入。
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (!root) return new TreeNode(val);
if (val val) {
root->left = insertIntoBST(root->left, val);
} else {
root->right = insertIntoBST(root->right, val);
}
return root;
}
立即学习“C++免费学习笔记(深入)”;
利用BST有序性,每次比较后只进一个子树,时间复杂度平均 O(log n)。
TreeNode* searchBST(TreeNode* root, int val) {
if (!root || root->val == val) return root;
if (val val) {
return searchBST(root->left, val);
} else {
return searchBST(root->right, val);
}
}
删除是 BST 最复杂的操作,需保证删除后仍为 BST。关键在“替代节点”的选择:
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return nullptr;
if (key val) {
root->left = deleteNode(root->left, key);
} else if (key > root->val) {
root->right = deleteNode(root->right, key);
} else {
// 找到要删除的节点
if (!root->left) return root->right;
if (!root->right) return root->left;
// 两个孩子:找左子树最大值(中序前驱)
TreeNode* predecessor = root->left;
while (predecessor->right) predecessor = predecessor->right;
root->val = predecessor->val;
root->left = deleteNode(root->left, predecessor->val);
}
return root;
}
注意:用右子树最小值(中序后继)同样可行,逻辑对称。选哪个取决于风格偏好,不影响正确性。
以上就是如何用c++++实现一个二叉搜索树 节点的插入、查找和删除【数据结构】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号