攻克代码随想录Day23 | 二叉树篇:699. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树
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. 将有序数组转换为二叉搜索树
该题是今天所有题中最简单的题了。首先我们先找到输入数组最中间的数(对于长度为偶数的数组,最中间的两个数二者择一即可),然后将该数的值设为头节点的值,并以该值拆分左右两个数组,左右孩子节点的值则为以该数组由中间值拆分的两个数组作为参数导入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. 把二叉搜索树转换为累加树
本题采取反后序遍历:右->中->左进行遍历。然后采取一个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;
};