代码随想录第22天|二叉树

235. 二叉搜索树的最近公共祖先

在这里插入图片描述
在这里插入图片描述
补充:
在这里插入图片描述

参考

思路:

  • 利用二叉搜索树的性质, 不需要全部遍历, 只搜索一条边即可
  • node->val 一定在 p->val 和 q->val 之间, 且一定是最近公共祖先
    • 在这里插入图片描述
    • 若 q=25, p=35 则 40 不满足在 p,q 之间, 而 30 满足

在这里插入图片描述

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr) return nullptr;
        if (root->val >= p->val && root->val <= q->val) return root;
        if (root->val <= p->val && root->val >= q->val) return root;

		//等价于只遍历一边
        TreeNode* res = nullptr;
        if (root->val > p->val && root->val > p->val) {
            res = lowestCommonAncestor(root->left, p, q);
        } else if (root->val < p->val && root->val < p->val) {
            res = lowestCommonAncestor(root->right, p, q);
        } 
        return res;
    }
};

701.二叉搜索树中的插入操作

在这里插入图片描述
在这里插入图片描述

思路:

  • 二叉搜索树不需要全部遍历
  • 不需要调整二叉树, 直接寻找位置插入该节点即可
  • 不需要遍历整个子树

请添加图片描述

在这里插入图片描述

//无返回值写法
class Solution {
public:
    TreeNode* pre = nullptr;
    void myoperator(TreeNode* node, int val) {
        if (node == nullptr) {		//一定要在节点为空时插入, 会出现不为叶子节点的情况
            if (pre->val > val) {
                pre->left = new TreeNode(val);
            } else {
                pre->right = new TreeNode(val);
            }
            return;
        }

        pre = node;
        if (node->val > val) {
            myoperator(node->left, val);
        } else if (node->val < val) {
            myoperator(node->right, val);
        }

    }
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if (root == nullptr)
            return new TreeNode(val);
        myoperator(root, val);
        return root;
    }
};

450.删除二叉搜索树中的节点

在这里插入图片描述
在这里插入图片描述
参考

需要分情况讨论
在这里插入图片描述
请添加图片描述
在这里插入图片描述

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if (root == nullptr)
            return nullptr;
		//前中后序都可
        if (root->val > key)
            root->left = deleteNode(root->left, key);
        if (root->val < key)
            root->right = deleteNode(root->right, key);

        if (root->val == key) {
            if (root->left == nullptr && root->right == nullptr)
                return nullptr;
            else if (root->left == nullptr && root->right != nullptr) {
                return root->right;
            } else if (root->left != nullptr && root->right == nullptr) {
                return root->left;
            } else {
                TreeNode* tem = root->right;
                while (tem->left != nullptr) {
                    tem = tem->left;
                }
                tem->left = root->left;
                return root->right;
            }
        }
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值