235. 二叉搜索树的最近公共祖先
不想动脑子,沿用了 普通二叉树的 最近公共祖先,和昨天那题一样
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL||root==p||root==q) return root;
TreeNode* left= lowestCommonAncestor(root->left,p,q);
TreeNode* right= lowestCommonAncestor(root->right,p,q);
if(left!=NULL && right!=NULL) return root;
if(left==NULL && right!=NULL) return right;
else if(left!=NULL && right==NULL) return left;
else{
return NULL;
}
}
};
701.二叉搜索树中的插入操作
1. 有返回值和无返回值的递归很不一样。没有仔细区分。这题的关键是有返回值,所以递归的时候让左子树等于 函数的返回值。
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==NULL)
{
TreeNode* newnode=new TreeNode(val);
return newnode;//这个地方是返回值。不用root->left=newnode 细细品味
}
if(val>root->val)
{
root->right=insertIntoBST(root->right,val);
}
if(val<root->val)
{
root->left=insertIntoBST(root->left,val);
}
return root;
}
};
450.删除二叉搜索树中的节点
1.需要考虑的情况很多,这种复杂的情况试着自己想一下,想完整。
2. 注意左右子树都是一大串,不止一个单结点。情况四就是这样。左子树串在 右子树的最左边。(左子树串都比root小,root比右子树串小,右子树的左下角最小)
3. 第一次使用auto,自动匹配类型,有点像golang里面的:=
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
//逻辑好复杂
if(root==nullptr) return root; //没找到删除的点
if(root->val==key)
{
//情况一:左右子树都为空
if(root->right==NULL&& root->left==NULL)
{
delete root;
return nullptr;
}
//情况二:右子树为空
if(root->right==NULL && root->left!=NULL)
{
auto oldnode=root->left;//auto自动匹配类型
delete root;
return oldnode;
}
//情况三:左子树为空
if(root->right!=NULL && root->left==NULL)
{
TreeNode* oldnode=root->right;
delete root;
return oldnode;
}
//情况四:左右子树都不为空
if(root->right!=NULL && root->left!=NULL)
{
//把左子树 移到 右子树的最左边
TreeNode* cur=root->right;
while(cur->left!=nullptr)
{
cur=cur->left;
}
cur->left=root->left;
TreeNode* temp=root;
root=root->right;
delete temp;
return root;
}
}
if(key>root->val)
{
root->right=deleteNode(root->right,key);
}
if(key<root->val)
{
root->left=deleteNode(root->left,key);
}
return root;
}
};
标签:right,TreeNode,root,二叉,搜索,return,NULL,树中,left
From: https://blog.csdn.net/qq_42818497/article/details/141597125