目录
LeetCode 669. 修剪二叉搜索树
LeetCode 108. 将有序数组转换为二叉搜索树
LeetCode 538. 把二叉搜索树转换为累加树
LeetCode 669. 修剪二叉搜索树
题目链接:LeetCode 669. 修剪二叉搜索树
思想:本题其实比较简单,首先就是遍历整棵树,遇到节点的值如果不在所要求的区间范围内的话,就进行以下处理;如果节点值大于右边界,就返回当前节点的左节点;反之就返回当前节点的右节点。
代码如下:
TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return nullptr;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;}
LeetCode 108. 将有序数组转换为二叉搜索树
题目链接:LeetCode 108. 将有序数组转换为二叉搜索树
思想:其实本题特别像之前的一道根据前中序序列构造二叉树,大体上与其十分相似,只是确定root节点的时候,取数组最中间的元素即可。
代码如下:
TreeNode* sortedArrayToBST(vector<int>& nums) {if (nums.size() == 0) return NULL;int rootIndex = nums.size() / 2;int rootValue = nums[rootIndex];TreeNode* cur = new TreeNode(rootValue);if (nums.size() == 1) return cur;vector<int> left(nums.begin(), nums.begin() + rootIndex);vector<int> right(nums.begin() + rootIndex + 1, nums.end());cur->left = sortedArrayToBST(left);cur->right = sortedArrayToBST(right);return cur;}
LeetCode 538. 把二叉搜索树转换为累加树
题目链接:LeetCode 538. 把二叉搜索树转换为累加树
思想:本题的意思其实是,将一个二叉搜索树转化为升序数组的话,例如[1,2,3],其对应的累加树序列就是,每个数加其本身以及大于本身的元素,即[6,5,1]。那这样的就是每个数加其本身以及后面的数。我们知道中序遍历出来的是升序二叉搜索树数组,那么反中序遍历也就是右中左的话,出来的就是降序二叉搜索树数组,就可以从前一直加到最后了。
代码如下:
int pre = 0;void traversal(TreeNode* cur){if(!cur) return;traversal(cur->right);cur->val += pre;pre = cur->val;traversal(cur->left);}TreeNode* convertBST(TreeNode* root) {if (!root) return NULL;traversal(root);return root;}