代码随想录算法训练营 | 二叉树part08

669. 修剪二叉搜索树

669. 修剪二叉搜索树

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if (root == nullptr) return nullptr;
        // 当前节点的值 < low ; 
        // 根据二叉搜索树左子树上的节点的小于根节点的节点值,所以左子树上的节点可以全部删除
        // 右子树上的节点的大于根节点的节点值,我们要在遍历右子树判断 那些节点值在 [low, high] 范围内
        if (root->val < low) return trimBST(root->right, low, high);
        // 当 > high 时,右子树上全部大于,判断左子树
        if (root->val > high) return trimBST(root->left, low, high);
        // 当前节点的值在 [low, high] 范围内,分别遍历左右子树
        root->left = trimBST(root->left, low, high);
        root->right = trimBST(root->right, low, high);
        return root;
    }
};

会想到判断大于low的右子树,但是具体的处理很懵,脑子里全是删除节点的操作。

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

108.将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。

平衡二叉搜索树 AVL树
左子树与右子树高度之差的绝对值不超过1
树的每个左子树和右子树都是AVL树
每一个节点都有一个平衡因子(balance factor),任一节点的平衡因子是-1、0、1(每一个节点的平衡因子 = 右子树高度 - 左子树高度)

class Solution {
public:
    TreeNode* traversal(vector<int>& nums, int left, int right) {
        if (left > right) {
            return nullptr;
        }
        int mid = left + (right - left) / 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) {
        return traversal(nums, 0, nums.size() - 1);
    }
};

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

538.把二叉搜索树转换为累加树
要每个节点 node 的新值等于原树中大于或等于 node.val 的值之和;根据二叉搜索树的性质要优先遍历右子树,得到节点和;

class Solution {
public:
    void convert (TreeNode* root, int& sum) {
        if (root == nullptr) {
            return;
        }
        convert(root->right, sum); // 遍历右子树
        sum += root->val; // 大于等于node.val,更新节点和 在赋值
        root->val = sum;
        convert(root->left, sum); // 遍历左子树
    }
    TreeNode* convertBST(TreeNode* root) {
        int sum = 0;
        convert(root, sum);
        return root;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值