代码随想录刷题Day44
二叉搜索树的最近公共祖先
这道题,可以沿用二叉树的最近公共祖先的求法进行求解,也就是root判断-左右子树递归求LCA-根据左右子树的LCA结果返回值这一套。
但是,如果要用上搜索二叉树的有序性这个信息的话,就可以直接在递归时候确定结果,而不需要回溯了:如下,根据左子树节点都小于根节点,右子树节点都大于根节点的规律,从根节点不断往下递归,根据值的大小“剪枝”,直到不能剪枝时,返回结果:
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(p->val <root->val && q->val <root->val){//两个要找的值在当前根节点的左子树上return lowestCommonAncestor(root->left,p,q);}else if(p->val > root->val && q->val > root->val){//两个要找的值在当前根节点的右子树上return lowestCommonAncestor(root->right,p,q);}else return root;}
};
二叉搜索树中的插入操作
插入新节点,先找到新节点在树中的位置:val比节点小,则在左子树中找;val比节点大,则在右子树中找:
class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(root==nullptr){return new TreeNode(val);}TreeNode* cur = root;TreeNode* pre =root;while(cur){pre = cur;if(val>cur->val){//插入右子树cur = cur->right;}else{//插入左子树cur = cur->left;}}if(val > pre->val) pre->right = new TreeNode(val);else pre->left = new TreeNode(val);return root;}
};
但是这里要注意的是,root是空树的情况,我第一边写,就忘了树可能为空,导致只有8个测试例子过了。
这两题,都是用到二叉搜索树的“有序”特性,和之前中序遍历验证的思路不一样,这里是使用二叉搜索树的有序性来指引递归的方向。