Day23 BST LeetCode 669 108 538

99 阅读2分钟

669. 修剪二叉搜索树

心得

  • 看到题目想套用移除元素办法,考虑移除元素结点的位置,比如叶子结点,正常结点等,然后通过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;
    }
};

108. 将有序数组转换为二叉搜索树

心得

  • 强调平衡二叉树,暗示分割数组每次取中间结点,否则单链也满足条件,过于简单,注意越界处理,同时保持左闭右开,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());
    }
};

538. 把二叉搜索树转换为累加树

心得

  • 第一感觉一直压栈右结点然后出栈累加,想到左节点可能需要右边和左边的值,有点复杂,其实思路是正确的,核心还是在于遍历顺序,
  • 当时想到逆序即右左中然后记录前一个的值,进行递归,但是看到题目的函数需要返回值,实际好像不同返回值,就没仔细往下做
  • 应该摈除题目函数干扰,很多次都是接近接近方案,就差临门一脚,核心在于遍历二叉树不熟悉
  • 应该转变思路,尤其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;
    }
};