Leetcode 235 二叉搜索树的最近公共祖先
由于二叉搜索树是有序的,p和q的最近公共祖先总是出现在p<root -> val < q的节点
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL) {return NULL;}
if(root -> val > p -> val && root -> val > q -> val){
TreeNode* left = lowestCommonAncestor(root -> left, p, q);
if(left != NULL){
return left;
}
}
if(root -> val < p -> val && root -> val < q -> val){
TreeNode* right = lowestCommonAncestor(root -> right, p, q);
if(right != NULL){
return right;
}
}
return root;
}
};
Leetcode 701 二叉搜索树的插入操作。
尽管插入结果有多种可能,但是由于二叉搜索树的有序性,有一种情况是value总是被插到叶子节点上。
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root == NULL) {
TreeNode* node = new TreeNode(val);
return node;
}
if(root -> val > val) {
root -> left = insertIntoBST(root -> left, val);
}
if(root -> val < val) {
root -> right = insertIntoBST(root -> right, val);
}
return root;
}
};
Leetcode 二叉搜索树的删除操作
删除有多种情况。1. 未找到被删除的key,不做任何处理;2.被删除的key,左子节点为空,右不空,右孩子补位;3.被删除的key左空右不空,左孩子补位;4.被删除的key左右都不空,左孩子插入到右孩子的最左下角 ;5.被删除的key左右都空,直接删除。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
//没有找到key
if(root == NULL) {return root;}
if(root -> val == key){
//1.key为叶子节点,直接删除
if(root -> left == NULL && root -> right == NULL){
return NULL;
}
//2.key的左子节点为空,右不空
else if(root -> left == NULL && root -> right != NULL){
return root -> right;
}
//3.key的左不空,右为空
else if(root -> left != NULL && root -> right == NULL){
return root -> left;
}
//4.key的左右都不空
else if(root -> left != NULL && root -> right != NULL){
TreeNode* cur = root -> right;
while(cur -> left != NULL){
cur = cur -> left;
}
cur -> left = root -> left;
return root -> right;
}
}
if(root -> val > key) {root -> left = deleteNode(root -> left, key);}
if(root -> val < key) {root -> right = deleteNode(root -> right, key);}
return root;
}
};