【算法】代码随想录训练营Day23打卡,leetcode 669.修减搜索二叉树 108.将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

【算法】代码随想录训练营Day23打卡,leetcode 669.修减搜索二叉树 108.将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

      • 解法
    • 108.将有序数组转换为二叉搜索树
      • 解法
    • 538. 把二叉搜索树转换为累加树
      • 题解

##669.修减搜索二叉树
力扣链接:https://leetcode.cn/problems/trim-a-binary-search-tree/description/

这道题我们来思考一下,我们有一个左边界和右边界,
那我们在判断一个节点的时候,因为是搜索二叉树,如果节点的val小于 左边界
那么我们就要去找他的右子树是否符合规则,
反之则是去找他的左子树

迭代法的话我们首先要判断头节点是否处在范围内,如果不在范围内,然后把头节点的指针移动到核发的范围内。
然后我们从头节点分别迭代遍历左子树和右子树

解法

递归

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} low
 * @param {number} high
 * @return {TreeNode}
 */
var trimBST = function(root, low, high) {
    if(root == null) return null; // 如果头节点都为null 则就返回
    if(root.val < low){
    	// 递归入口就判断当前节点是否在范围内
    	let left = trimBST(root.right,low,high);
    	return left;//如果小于则递归右子树 并将结果返回
    }
    if(root.val > high){
		let right = trimBST(root.left,low,high);
		return right; // 如果大于则递归左子树,并将结果返回
	}
	root.left = trimBST(root.left,low,high);
	root.right = trimBST(root.right,low,high);
	return root;
};

迭代法

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} low
 * @param {number} high
 * @return {TreeNode}
 */
var trimBST = function(root, low, high) {

    if(root == null) return null;
    // 首先判断是否头节点处于范围内
    while(root!=null && (root.val < low || root.val>high)){
        if(root.val < low){
            root = root.right;
        }else{
            root = root.left;
        }
    }
    let cur = root;
    while(cur!==null){
        while(cur.left && cur.left.val < low){
            cur.left = cur.left.right
        }
        cur = cur.left;
    }
    //遍历右子树
    cur = root;
    while(cur !== null){
        while(cur.right && cur.right.val > high){
            cur.right = cur.right.left;
        }
        cur = cur.right
    }

    return root
};

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

力扣链接:https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/

这道题首先我们有一个有序数组,
要构建一棵高度平衡的二叉树,我们就可以从数组的中间取值作为头节点

解法

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var sortedArrayToBST = function(nums) { 
     const buildTree = (Arr, left, right) => {
        if (left > right)
            return null;
        let mid =  left+((right-left)>>1);

        let root = new TreeNode(Arr[mid]);
        root.left = buildTree(Arr,left,mid-1);
        root.right = buildTree(Arr,mid+1,right);
        return root;
     }
     return buildTree(nums,0,nums.length-1)
};

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

力扣链接:https://leetcode.cn/problems/convert-bst-to-greater-tree/

这道题我们看题,根据例题我们可以知道,
他的累加顺序是从右子树开始 到中间节点 再到左子树
那么 右中左的顺序 可以一眼就看出
是中序遍历倒一下顺序
所以我们用中序遍历然后反转一下 left 和 right的位置
创建一个全局的pre,从0开始 每次遍历到mid的位置就叠加

题解

**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var convertBST = function(root) {
   let pre = 0 ; //用于累加
   const buildTree = (node)=>{
		if(node){
		//先右再左
			buildTree(node.right);
			pre += node.val;
			node.val = pre;
			buildTree(node.left);
		}
		return node;
	}
	buildTree(root);
	return root;
};

你可能感兴趣的:(算法打卡记录,算法,leetcode,javascript)