LeetCode 235 二叉搜索树的最近公共祖先 2023.11.15
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//退出递归条件:遍历节点为空时返回空
if(root == NULL)
return NULL;
//要搜索的节点都在根节点右侧时,遍历右节点
if(root->val < p->val && root->val < q->val)
return lowestCommonAncestor(root->right, p, q);
//要搜索的节点都在根节点左侧时,遍历左节点
else if(root->val > p->val && root->val > q->val)
return lowestCommonAncestor(root->left, p, q);
//其他情况,包括当前遍历节点为p、q其中一节点或p、q节点分别在遍历节点左边和右边时
else
return root;
}
LeetCode 701 二叉搜索树中的插入操作 2023.11.15
-
在不重复值的二叉搜索树中插入一个新节点,始终可以将其插在某一叶子结点上
TreeNode* insertIntoBST(TreeNode* root, int val) {
//在不重复值的二叉搜索树中插入一个新节点,始终可以将其插在某一叶子结点上
//退出递归条件,遍历到叶子结点的下一个节点时,赋值给该节点并返回
if(root == NULL)
{
root = new TreeNode(val);
return root;
}
//当遍历节点值大于插入值时,遍历左子树并返回
if(val < root->val)
root->left = insertIntoBST(root->left, val);
//当遍历节点值小于插入值时,遍历右子树并返回
else if(val > root->val)
root->right = insertIntoBST(root->right, val);
return root;
}
LeetCode 450 删除二叉搜索树中的节点 2023.11.15
//我做的时候没有删除搜索节点的内存
TreeNode* deleteNode(TreeNode* root, int key) {
//判断递归失效条件:没找到key值或者节点为空,返回空
if(root == NULL)
return NULL;
//当节点值小于搜索值,则遍历右节点
if(root->val < key)
root->right = deleteNode(root->right, key);
//当节点值大于搜索值,则遍历左节点
else if(root->val > key)
root->left = deleteNode(root->left, key);
//当节点值等于搜索值,则做处理
else
{
//删除节点左右节点都存在时,把右树放在左树的最右下节点,因为右树上所有节点大于左树
if(root->left && root->right)
{
TreeNode* node = root->left;
while (node->right)
node = node->right;
node->right = root->right;
return root->left;
}
//删除节点左节点存在,右节点不存在时,返回左节点
else if(root->left && root->right == NULL)
return root->left;
//删除节点右节点存在,左节点不存在时,返回右节点
else if(root->left == NULL && root->right)
return root->right;
//删除节点左右节点都不存在时,返回空
else
return NULL;
}
return root;
}