【攻克代码随想录Day23 | 二叉树篇:699. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树】

攻克代码随想录Day23 | 二叉树篇:699. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树

699. 修剪二叉搜索树

不得不说,这题是稍微有一定挑战的。
699. 修剪二叉搜索树
作为二叉树的初学者,本题我还是打算采用递归的方式进行解题。本题采用的方式还是前序遍历,如果发现有点在区间外的情况,则进行进一步的判定如果该节点的值小于low,则必定该节点左孩子节点的值也小于low。因此,我们只用把该节点右孩子节点赋给该节点,然后将给节点送回原函数进行递归。同理,如果该节点的值大于high,则把该节点左孩子节点赋给该节点,并继续进行递归。最终,返回头节点值。

/**
 * 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) {
    if(!root) return null;
    let count = 0;
    let reviseNum = function(root) {
        root.right && reviseNum(root.right);
        count += root.val;
        console.log(count);
        root.val = count;
        root.left && reviseNum(root.left);
    }
    reviseNum(root);
    return root;
};

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

108. 将有序数组转换为二叉搜索树
该题是今天所有题中最简单的题了。首先我们先找到输入数组最中间的数(对于长度为偶数的数组,最中间的两个数二者择一即可),然后将该数的值设为头节点的值,并以该值拆分左右两个数组,左右孩子节点的值则为以该数组由中间值拆分的两个数组作为参数导入sortedArrayToBST()函数的返回值。通过不断递归,最中返回头节点roote即可。

/**
 * 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) {
    if(nums.length === 0) return null;
    let mid = Math.floor((nums.length - 1) / 2);
    const node = new TreeNode(nums[mid]);
    node.left = sortedArrayToBST(nums.slice(0, mid));
    node.right = sortedArrayToBST(nums.slice(mid + 1));
    return node;
};

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

538. 把二叉树转换为累加树
本题采取反后序遍历:右->中->左进行遍历。然后采取一个count值来计累加值,根本原理就是在后序遍历中修改导入左右孩子节点的顺序,然后对处理中间节点的操作进行修改:count累加以及赋值

/**
 * 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) {
    if(!root) return null;
    let count = 0;
    let reviseNum = function(root) {
        root.right && reviseNum(root.right);
        count += root.val;
        console.log(count);
        root.val = count;
        root.left && reviseNum(root.left);
    }
    reviseNum(root);
    return root;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值