【前端er每日算法】二叉树三题--669/108/538

41 阅读1分钟

题目一 669. 修剪二叉搜索树

思路

var trimBST = function(root, low, high) {
    if (!root) {
        return null;
    }
    if (root.val < low) {
        const right = trimBST(root.right, low, high);
        return right;
    }
    if (root.val > high) {
        const left = trimBST(root.left, low, high);
        return left;
    }
    root.left = trimBST(root.left, low, high);
    root.right = trimBST(root.right, low, high);
    return root;
};

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

思路

  • 选取中间节点作为根节点
  • 中间节点左侧作为跟节点的左子树,右侧数组作为右子树
var sortedArrayToBST = function(nums) {
    const traversal = (nums, start, end) => {
        if (start >= end) {
            return null;
        }
        let mid = start + parseInt((end - start) / 2, 10);
        const root = new TreeNode(nums[mid]);
        root.left = traversal(nums, start, mid);
        root.right = traversal(nums, mid + 1, end);
        return root;
    }
    return traversal(nums, 0, nums.length);
};

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

思路

利用pre记录上一个节点,而且这个遍历是右中左来遍历。每次加上右侧数据,同时更新pre。

var convertBST = function(root) {
    let pre = 0;
    const traversal = root => {
        if (!root) {
            return root;
        }
        traversal(root.right);
        root.val += pre;
        pre = root.val;
        traversal(root.left);
        return root;
    };
    return traversal(root);
};