代码随想录第二十三天|LeetCode 669. 修剪二叉搜索树 、LeetCode108.将有序数组转换为二叉搜索树 、LeetCode538.把二叉搜索树转换为累加树

LeetCode 669. 修剪二叉搜索树

题目链接:669. 修剪二叉搜索树

先看一遍题解,大致就懂了方法。

根据二叉搜索树的性质:左子节点小于父节点小于右子节点

可以先找到符合区间的父节点,然后向左寻找修剪不符合区间的节点,再向右寻找修剪。

先处理的是父节点,所以父节点一定在区间内,然后判断左子节点是否小于最小区间,如果是则左子节点的左子树必定都小于区间,不必再处理,而左子节点的右子树要大于左子节点,还要进一步去处理。如果左子节点大于区间,则继续向左边去判断。

右子节点的处理同左子节点类似,不过大小和处理先后要相反。

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root == NULL) return NULL;
        //先让头节点定位到符合区间节点的位置
        while (root != NULL && (root -> val < low || root -> val > high)) {
            if(root -> val < low) root = root -> right;
            else root = root -> left;
        }
         //再向左修改不符合区间的节点
        TreeNode* cur = root;
        while(cur != NULL) {
            //如果左子节点小于区间最小值,将当前节点的做指针指向左子节点的右子节点,然后继续判断左指针指向的节点,否则继续向左判断
            if(cur -> left != NULL && cur -> left -> val < low) {
                cur -> left = cur -> left -> right;
            }
            else cur = cur -> left;
        }
        //向右修改不符合区间的节点
        cur = root;
        while(cur != NULL) {
            //同上向左修改
            if(cur -> right != NULL && cur -> right -> val > high) {
                cur -> right = cur -> right -> left;
            }
            else cur = cur -> right;
        }
        return root;

    }
};

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

题目链接:108.将有序数组转换为二叉搜索树  

这道题很简单,每次去数组中间的树作为根节点,然后将数组从中间分成左右两个数组,左边的数组当作左子树,右边的数组当作右子树,继续向左右递归去创建,然后返回给左右子节点。

以下是代码:

class Solution {
public:
    TreeNode* sortedArrayToBST(vector& nums) {
        //当数组长度为0时,说明无节点,长度为1时为叶子节点
        if(nums.size() == 0) return NULL;
        if(nums.size() == 1) {
            TreeNode* root = new TreeNode(nums[0]);
            return root;
        }
        //找到数组最中间的的位置,将其创建成根节点,然后将数组从这分成左右两个数组,作为左右两棵子树
        int mid = nums.size() / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        vectorleftnums(nums.begin(),nums.begin() + mid);
        vectorrightnums(nums.begin() + mid + 1, nums.end());
        root -> left = sortedArrayToBST(leftnums);//向左递归创建左子树
        root -> right = sortedArrayToBST(rightnums);//向右递归创建右子树
        return root;//最后返回根节点

    }
};

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

题目链接:538.把二叉搜索树转换为累加树  

用一个临时变量动态存储每个节点要加上的数值,先通过递归向右走,直到走到最右下端,找到树的最大值,然后用临时变量存储最大值,再通过回溯到上一个节点,然后将该节点的值加上临时变量,再让临时变量等于该节点的值(跟新临时变量),然后向左子节点递归。

最后返回根节点即可。

代码如下:

class Solution {
    private:
    int tem = 0;//用一个临时变量存储每个节点要加的值
public:
    void travel(TreeNode* root) {
        if(root == NULL) return;
        travel(root -> right);//每次先向右递归,找到每颗子树的最右端然后开始回溯
        root -> val += tem;
        tem = root -> val;
        travel(root -> left);//然后向左一步
        return;
    }
    TreeNode* convertBST(TreeNode* root) {
        travel(root);
        return root;
    }
};

你可能感兴趣的:(leetcode,数据结构,算法)