669. 修剪二叉搜索树 ★
文档讲解 : 代码随想录 - 669. 修剪二叉搜索树
状态:再次回顾。(★:需要多次回顾并重点回顾)
思路图解:
本题代码:
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr) 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;
}
};
108.将有序数组转换为二叉搜索树
文档讲解 : 代码随想录 - 108.将有序数组转换为二叉搜索树
状态:再次回顾。
数组转二叉树本质:寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
注意这里定义的是左闭右闭区间,注意循环不变量。
本题代码:
class Solution {
private:
TreeNode* traversal(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 = traversal(nums, left, mid - 1);
root->right = traversal(nums, mid + 1, right);
return root;
}
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1); // 在调用traversal的时候传入的left和right为什么是0和nums.size() - 1,因为定义的区间为左闭右闭。
return root;
}
};
538.把二叉搜索树转换为累加树
文档讲解 : 代码随想录 - 538.把二叉搜索树转换为累加树
状态:再次回顾。
从树中可以看出累加的顺序是右中左,需要反中序遍历这个二叉树,然后顺序累加。
递归顺序:
本题代码:
class Solution {
private:
int pre = 0; // 记录前一个节点的数值
void traversal(TreeNode* cur) { // 右中左遍历
if (cur == NULL) return;
traversal(cur->right);
cur->val += pre;
pre = cur->val;
traversal(cur->left);
}
public:
TreeNode* convertBST(TreeNode* root) {
pre = 0;
traversal(root);
return root;
}
};
二叉树:总结篇
文档讲解 : 代码随想录 - 二叉树:总结篇
状态:再次回顾。
- 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
- 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
- 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。
总结图: