心得
- 看到题目想套用移除元素办法,考虑移除元素结点的位置,比如叶子结点,正常结点等,然后通过return回溯的方式进行替换
- 但是替换后的如何处理,没想好,直接return需要左右子树调整,相当于手动去调整,没考虑到在结点处理部分也可以用递归
- 还是要加强锻炼,见识少了
题解
- 避免典型误区,考虑需要移除的情况,直接再次用递归处理可能存在的部分即可
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;
}
};
心得
- 强调平衡二叉树,暗示分割数组每次取中间结点,否则单链也满足条件,过于简单,注意越界处理,同时保持左闭右开,AC
题解
class Solution {
public:
TreeNode* traversal(vector<int>& vec, int left, int right) {
if (left >= right) return nullptr;
int mid = left + (right - left) / 2;
TreeNode* root = new TreeNode(vec[mid]);
root->left = traversal(vec, left, mid);
root->right = traversal(vec, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};
心得
- 第一感觉一直压栈右结点然后出栈累加,想到左节点可能需要右边和左边的值,有点复杂,其实思路是正确的,核心还是在于遍历顺序,
- 当时想到逆序即右左中然后记录前一个的值,进行递归,但是看到题目的函数需要返回值,实际好像不同返回值,就没仔细往下做
- 应该摈除题目函数干扰,很多次都是接近接近方案,就差临门一脚,核心在于遍历二叉树不熟悉
- 应该转变思路,尤其BST,转为有序数组就简单很多,类似的数组方法和操作如双指针就很用
题解
// 递归
class Solution {
public:
int prev = 0
void traversal(TreeNode* cur) {
if (cur == nullptr) return
traversal(cur->right)
cur->val += prev
prev = cur->val
traversal(cur->left)
}
TreeNode* convertBST(TreeNode* root) {
traversal(root)
return root
}
}
// 迭代
class Solution {
private:
int prev
void traversal(TreeNode* cur) {
stack<TreeNode*> st
while (cur != nullptr || !st.empty()) {
if (cur != nullptr) {
st.push(cur)
cur = cur->right
} else {
cur = st.top()
st.pop()
cur->val += prev
prev = cur->val
cur = cur->left
}
}
}
public:
TreeNode* convertBST(TreeNode* root) {
prev = 0
traversal(root)
return root
}
}