##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
};
力扣链接: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)
};
力扣链接: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;
};