没想到最近公共祖先竟然可以是板子
板子(同234题)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p||root == q ||root == NULL) return root;
TreeNode* left =lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(right!=NULL&&left!=NULL) return root;
if(right!=NULL&&left==NULL) return right;
if(right==NULL&&left!=NULL) return left;
else return NULL;
}
};
235. 二叉搜索树的最近公共祖先
话说看到BTS要无脑中序的,本题思路是根据BTS的特性返回的公共祖先在其q,p节点之间
1.递归法
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)//说明公共祖先一定在root左边
{
TreeNode*left = lowestCommonAncestor(root->left,p,q);//向左遍历子树返回left
if (left!=NULL)//如果left不等于空,说明返回的为公共祖先
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;//如果上面不满足,则说明这个接点>q->val,<p->val,则本身为公共祖先节点
}
};
2.迭代法
思路一样,只不过遍历了节点
代码如下:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root)
{
if(root->val>p->val && root->val>q->val)//公共祖先在右情况
{
root=root->left;
}
else if(root->val<q->val &&root->val<p->val)//公共祖先在左情况
{
root=root->right;
}
else return root; //在其之间的情况
}
return NULL;//如果while中未返回,则返回NULL
}
};
701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据
保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
返回如下也是可以的
思路:
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == NULL)//插入操作
{
TreeNode* node = new TreeNode(val);//定义节点并且初始化为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;//最后返回新BST
}
};
450.删除二叉搜索树中的节点
思路:
/**
* Definition for a binary tree node.
* 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(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == NULL) return root;//1
if(key == root->val)
{
if(root->left==NULL&&root->right ==NULL)//2
{
return NULL;
}
else if(root->left==NULL&&root->right!=NULL)//3
{
return root->right;
}
else if(root->left!=NULL&&root->right==NULL)//4
{
return root->left;
}
else{ //5
TreeNode* cur=root->right;
while(cur->left)
{
cur=cur->left;
}
cur->left=root->left;//在前(顺序反了逻辑错)
root=root->right;//在后
return root;
}
}
//BST特性递归
if(key >root->val) root->right=deleteNode(root->right,key);
if(key <root->val) root->left=deleteNode(root->left,key);
return root;
}
};