669. 修剪二叉搜索树
题目:力扣
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if(root == nullptr) return root;
if(root->val < low){
root->right = trimBST(root->right,low,high);
return root->right;
}
if(root->val > high){
root->left = trimBST(root->left,low,high);
return root->left;
}
root->left = trimBST(root->left,low,high);
root->right = trimBST(root->right,low,high);
return root;
}
};
108.将有序数组转换为二叉搜索树
题目:力扣
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return nullptr;
int i = nums.size() / 2 ;
TreeNode* root = new TreeNode(nums[i]);
if(nums.size() == 1) {
return root;
}
vector<int> v_left(nums.begin(),nums.begin() + i);
vector<int> v_right(nums.begin() + i + 1, nums.end());
root->left = sortedArrayToBST(v_left);
root->right = sortedArrayToBST(v_right);
return root;
}
};
538.把二叉搜索树转换为累加树
题目:力扣
class Solution {
public:
int sum = 0;
TreeNode* convertBST(TreeNode* root) {
if(root == nullptr) return nullptr;
if(root->right) convertBST(root->right);
root->val = root->val + sum;
sum = root->val;
if(root->left) convertBST(root->left);
return root;
}
};
二叉树总结
题型:
(1)二叉树的理论基础
二叉树的种类,存储方式,遍历方式,定义方式
(2)二叉树的遍历方式
深搜 递归、迭代、栈
广搜 队列
(3)求二叉树的属性
是否对称
最大深度、最小深度
节点个数
是否平衡
所有的路径,路径总和
递归和回溯结合
求左叶子的和,求左下角的值
(4)二叉树的修改和改造
翻转、构造、合并
(5)求二叉搜索树的属性
搜索、判断是不是二叉树、最小绝对值、众数、累加数
(6)二叉树公共祖先问题
(7)二叉搜索树的修改与构造
插入、删除、修剪、构造
技巧:
二叉树问题主要就是考虑好如何进行递归和回溯
二叉搜索树利用好性质简化递归过程