算法训练营 第二十三天
二叉树 day09 最后一天啦!二叉树大成!
669.修剪二叉搜索树
我写这道题的时候,就是按照递归的三步走法则,想清楚输入输出和终止条件以及遍历顺序。
函数输入输出:
输入结点和最大最小边界,返回修建好的树的根节点
终止条件:
1、如果当前结点需要修剪
如果结点大于最大边界,向左搜索
如果结点小于最小边界,向右搜索
2、如果当前结点不用修剪
向左搜索
向右搜索
然后就做出来啦~
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr)
return root;
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;
}
};
108.将有序数组转换为二叉搜索树
同样的,想清楚输入输出和递归终止条件就行
输入输出:
输入一个数组,返回构造好的二叉搜索树的根节点
终止条件:
1、如果输入数组是空的,返回空结点
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if (nums.size() == 0)
return nullptr;
int index = nums.size() / 2;
vector<int>left(nums.begin(), nums.begin() + index);
vector<int>right(nums.begin() + index + 1, nums.end());
TreeNode* root = new TreeNode(nums[index]);
root->left = sortedArrayToBST(left);
root->right = sortedArrayToBST(right);
return root;
}
};
538. 把二叉搜索树转换为累加树
遍历顺序:右中左
输入输出:输入根节点,返回新的根节点
额外需要一个值保存遍历过的结点总值
终止条件:如果结点为空,则返回
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
if(root==nullptr)
return root;
convertBST(root->right);
root->val += sum;
sum = root->val;
convertBST(root->left);
return root;
}
int sum = 0;
};
二叉树总结
二叉树的遍历方法
深度优先遍历:前中后序遍历 可递归可迭代
广度优先遍历:层序遍历,一般用迭代
二叉树的属性
- 对称
- 最大深度
- 最小深度
- 求总结点数量
- 是否是平衡二叉树
- 找到所有路径(涉及回溯思想)
- 求左叶子之和
- 求左下角的值
- 求路径总和(和找到所有路径一样)
二叉树的修改和构造
- 翻转二叉树
- 构造二叉树
- 构造最大二叉树
- 合并两个二叉树
求二叉搜索树的属性
- 二叉搜索树的搜索
- 判断是否是二叉搜索树
- 求二叉搜索树的最小绝对差
- 求二叉树的众数