235. 二叉搜索树的最近公共祖先235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)
学习过236题之后,发现很多算法基础,搜索二叉树的性质,通过判断根节点大小来进行左右子树的区别,但是想不到若不能往左右子树往下面进行搜索,那么此根节点就是祖先。对于二叉树的一个个递归的返回属实有点捉摸不透。
class Solution {
public:
TreeNode* traversal(TreeNode* root, TreeNode* p, TreeNode* q)
{
if (root == NULL)return NULL;
if (root->val > p->val && root->val > q->val)
{
TreeNode*left= traversal(root->left, p, q);
if (left)return left;
}
if (root->val < p->val && root->val < q->val)
{
TreeNode* right = traversal(root->right, p, q);
if (right)return right;
}
return root;//加了这一句就瞬间清楚了,感觉最近刷太多二叉树的题目了,有点混淆了
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
return traversal(root, p, q);
}
};
701.二叉搜索树中的插入操作701. 二叉搜索树中的插入操作 - 力扣(LeetCode)
本来自己想了一种方法,放到了代码里面的备注中,但是发现只是局部变量,并不是全局变量的改变。
class Solution {
private:
TreeNode* parent;
void traversal(TreeNode* root, int val)
{
if (root == NULL)//若一开始root等于0
{
TreeNode* node = new TreeNode(val);//很奇怪不知道为什么不能直接将此结点更新为TreeNode(val)值
if (val > parent->val) parent->right = node;//就是为什么一定要用父结点来指定他,而不能让当前值直接等于他
else parent->left = node;
return;
}
parent = root;//记录父节点
if (root->val > val)//当前根节点值比右边大
{
traversal(root->left, val);
}
if (root->val < val)
{
traversal(root->right, val);
}
}
public:
TreeNode* insertIntoBST(TreeNode* root, int val)
{
parent = new TreeNode(0);
if (root == NULL)
{
root = new TreeNode(val);
}
traversal(root, val);
return root;
}
};
450.删除二叉搜索树中的节点
这题有点难度,还在理解中。