标签:它的 子节点 insert 依据 成功 tar ptr color val
二叉查找树又称二叉排序树,它要么是空树,要么是具有下列性质的二叉树:
若二叉查找树的根节点的指针为空,则查找不成功;否则进行一下的操作:
二叉查找树的递归查找算法实现代码如下:
TreeNode* Search(TreeNode* root, int target) { if (root == nullptr) return nullptr; else if (target < root->val) { return Search(root->left, target); } else if (target > root->val) { return Search(root->right, target); } else return root; }
由于递归算法的执行效率较低,因此可以改用非递归的算法实现二叉查找树。在非递归算法中,需要增加一个引用指针parent,若查找成功,则函数返回target所在节点的地址,parent返回该节点的双亲节点的地址;若查找不成功,则函数返回nullptr,parent返回新节点应插入的节点地址,此时新节点应作为叶节点被插入parent之下。
二叉查找树的非递归查找算法,代码如下:
TreeNode* Search(TreeNode* root, int target, TreeNode* &parent) { TreeNode* p = root; parent = nullptr; while (p != nullptr && p->val != target) { parent = p; if (target < p->val) { p = p->left; } if (target > p->val) { p = p->right; } } return p; }
在二叉查找树中插入一个新元素,首先要用查找算法检查该元素是否在树中已经存在。对于一个不存在于二叉查找树中的元素,其查找操作停止的位置即为该元素的插入位置。
二叉查找树的插入算法,代码如下:
void Insert(TreeNode* root, int x) { TreeNode *p, *parent; p = Search(root, x, parent); //寻找插入位置 if (p != nullptr) return; //查找成功,不插入 TreeNode* s = new TreeNode(x); //查找失败,创建新节点 if (parent != nullptr) { root = s; //原树为空,节点为根节点 } else if (x < parent->val) { parent->left = s; //原树非空,节点小于根节点作为左节点插入 } else if (x > parent->val) { parent->right = s; //原树非空,节点大于根节点作为右节点插入 } }
在二叉查找树中删除元素,分为以下两种情况:
二叉查找树的删除算法,代码如下:
void Delete(TreeNode* root, int x) { TreeNode* s, * p, * parent; p = Search(root, x, parent); //查找待删除节点,返回其指针和父节点 if (p == nullptr) return; //查找失败,不执行删除 if (p->left != nullptr && p->right != nullptr) //待删除节点左右子树都不为空 { s = p->right; parent = p; while (s->left != nullptr) { parent = s; s = s->left; } p->val = s->val; //将s指向的数据赋给p p = s; //*p成为待删除节点 } if (p->left != nullptr) s = p->left; //单子节点,记录非空子节点 else s = p->right; if (p == root) root = s; //被删除的节点为根节点 else if (s && s->val < parent->val) parent->left = s; else parent->right = s; free(p); //释放被删除节点 }
标签:它的 子节点 insert 依据 成功 tar ptr color val
原文地址:https://www.cnblogs.com/JCpeng/p/15043530.html