平衡树、二叉树、灵活应用中序遍历(值大小有序)
669. 修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。
发现规律:
二叉搜索树特性:左子树均小于根节点,右子树均大于根节点,所以若值不在区间则只需要保留其中一条子树;否则正常遍历处理
class Solution {
public:
//二叉搜索树特性:左子树均小于根节点,右子树均大于根节点,所以若值不在区间则只需要保留其中一条子树TreeNode* trimBST(TreeNode* root, int low, int high) {if(root == nullptr) return nullptr;if(root->val > high) {return trimBST(root->left, low, high);}else if(root->val < low) {return trimBST(root->right, low, high);}root->left = trimBST(root->left, low, high);root->right = trimBST(root->right, low, high);return root;}
};
108.将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
思路: 为使平衡,则取升序序列中间值为分割点(根节点),以分割点为界,左序列为左子树,右序列为右子树
class Solution {
public:
//平衡二叉搜索树,即二叉搜索树中每个节点的左右子树高度差绝对值相差不会超过1
//为使平衡,则取升序序列中间值为分割点(根节点)TreeNode* ArrayToBst(vector<int>& nums, int left, int right){if(left > right) return nullptr;TreeNode* root = new TreeNode();int mid = left + (right - left)/2;root->val = nums[mid];root->left = ArrayToBst(nums, left, mid-1);root->right = ArrayToBst(nums, mid+1, right);return root;}TreeNode* sortedArrayToBST(vector<int>& nums) {if(nums.empty()) return nullptr;return ArrayToBst(nums, 0, nums.size()-1);}
};
538.把二叉搜索树转换为累加树
思路:
从示例1可以看出 累加树逆中序(与正常中序不同,先访问右节点,后访问左节点)的节点值为降序累加序列
class Solution {
public:
//从示例1可以看出 累加树逆中序(与正常中序不同,先访问右节点,后访问左节点)的节点值为降序累加序列TreeNode* ToSumTree(TreeNode* root, int &num){if(root == nullptr) return nullptr;root->right = ToSumTree(root->right, num);num += root->val; //中序遍历保证访问序列值有序root->val = num;root-> left = ToSumTree(root->left, num);return root;}TreeNode* convertBST(TreeNode* root) {int num = 0;return ToSumTree(root, num);}
};