修剪二叉搜索树

题目理解

给一个二叉搜索树,给一个闭区间的边界,使得二叉树所有的节点值都位于区间内。

原始思路

根节点和区间的关系

1.如果根节点包含在区间里面,那么说明左边界一定在左子树,右边界一定在右子树。

向左子树遍历,找到左边界;

向右子树遍历,找到右边界。

2.如果根节点在区间外面:比左边界小或者比右边界大。如果比左边界小,开始遍历右子树的左孩子。如果比右边界大,则在左子树的有孩子里面找边界值。

代码

class Solution {
public:
    TreeNode* trimBST(TreeNode* root, int low, int high) {
        if(root==NULL) return NULL;
        if(root->val<low)  return trimBST(root->right,low,high);
        if(root->val>high) return trimBST(root->left,low,high);
        root->left =trimBST(root->left,low,high);
        root->right=trimBST(root->right,low,high);
        return root;
    }
};

将有序数组转化成二叉平衡搜索树

题目理解

平衡二叉树即所有节点的左右子树高度相差不超过1.

如果把有序数组转化成二叉搜索树,那么可能有不同的二叉树。限定高度为1,其解也不唯一。但是可能性没有不限定那么多。平衡二叉树的根节点一定是有序数组中间的那两个

值。至此,思路明了,找出根节点,对左边的数组构造左子树,对右边的数组构造右子树。直至root==NULL。

e6360ac14d6a337330813ae67e2bae00

原因

栈内存被耗尽。

代码

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

把二叉搜索树转化为累加树

题目理解

每个节点的新值等于右侧节点和自身节点的总和。

思路

要从最右边的节点开始(root->right==NULL),即最大的节点值开始。根节点的值是右节点的值加自身值,左节点的值是根节点加自身值。

代码

private:
    int pre = 0;
public:
    void traversal(TreeNode* root) {
        if (root == NULL)
            return;
        traversal(root->right);
        root->val += pre;
        pre = root->val;
        traversal(root->left);
    }
    TreeNode* convertBST(TreeNode* root) {
        int pre = 0;
        traversal(root);
        return root;
    }
};```
###总结
看似简单,实则写不出来。
posted on 2025-11-25 11:37  FAfa_C++  阅读(11)  评论(0)    收藏  举报