代码随想录Day9 二叉树--4

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

插入操作 我们只用找到末尾的节点就可以插入元素 根据插入元素的大小和二叉搜索树的性质 判断往左子树去还是右子树去 当节点为空时 就可以以val值新建立个节点

class Solution {
public:
    TreeNode* insertIntoBST(TreeNode* root, int val) {
        if(root==nullptr){
            TreeNode* node = new TreeNode(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;
    }
};

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

删除节点比较麻烦 分为5种情况 1没有找到要删除的节点 直接返回root 2如果该节点的左右孩子都为空 就直接删除delete 然后返回空 3如果要删除的节点左孩子为空 右孩子存在 就直接返回右孩子 4同理右孩子为空 左孩子存在 5左右孩子都存在 统一返回右孩子 但是要先找到右孩子的最左边的左孩子在它后面接上要删除节点的左孩子 后面分别接住返回的左右孩子

if (root->val > key) root->left = deleteNode(root->left, key);

if (root->val < key) root->right = deleteNode(root->right, key);

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr) return root;
        if(root->val==key){
            if(root->left==nullptr && root->right==nullptr){
                delete root;
                return nullptr;
            }else if(root->left==nullptr){
                auto node = root->right;
                delete root;
                return node;
            }else if(root->right==nullptr){
                auto node = root->left;
                delete root;
                return node;
            }else{
                TreeNode* cur = root->right;
                while(cur->left!=nullptr){
                    cur=cur->left;
                }
                cur->left = root->left;
                auto node = root->right;
                delete root;
                return node;
            }
        }
        if (root->val > key) root->left = deleteNode(root->left, key);
        if (root->val < key) root->right = deleteNode(root->right, key);
        return root; 
    }
};

108 将有序数组转换为二叉搜索树

思路简单 一半一半的添加 最中间的作为根节点 左边区间作为左子树 右边作为右子树 一直进行这样的操作

class Solution {
public:
    TreeNode* traversal(vector<int>& nums,int left, int right){
        if(left > right) return nullptr;
        int mid = (left+right)/2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = traversal(nums,left,mid-1);
        root->right = traversal(nums,mid+1,right);
        return root;
    } 
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        TreeNode* root = traversal(nums,0,nums.size()-1);
        return root;
    }
};

538 把二叉搜索树转换为累加树 

 

这道题是从最右侧节点开始相加 所以我们可以用双指针法 先一直向右孩子遍历 然后遇到空开始加上pre节点 然后向上回溯 然后遍历左子树 采用右中左的顺序

class Solution {
public:
    int pre = 0;
    void traversal(TreeNode* cur){
        if(cur==nullptr) return ;
        traversal(cur->right);
        cur->val+=pre;
        pre = cur->val;
        traversal(cur->left);
    }
    TreeNode* convertBST(TreeNode* root) {
        traversal(root);
        return root;
    }
};

 总结

二叉树章节终于结束了 到时候自己重写代码的时候估计又要老实了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值