学习目标:
● 669. 修剪二叉搜索树
● 108.将有序数组转换为二叉搜索树
● 538.把二叉搜索树转换为累加树
● 总结篇
学习内容:● 669. 修剪二叉搜索树
题目链接/文章讲解: https://programmercarl.com/0669.%E4%BF%AE%E5%89%AA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解: https://www.bilibili.com/video/BV17P41177ud
var trimBST = function (root,low,high) {
if(root === null) {
return null;
}
if(root.val < low) {
let right = trimBST(root.right, low, high);
return right;
}
if(root.val > high) {
let 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.将有序数组转换为二叉搜索树
https://programmercarl.com/0108.%E5%B0%86%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1uR4y1X7qL
在不断分割的过程中,也会坚持左闭右闭的区间
node.left = traversal(nums,left,mid-1)
node.right = traversal(nums,mid+1,right)
//直接以index形式操作原数组
var sortedArrayToBST = function(nums) {
let right = nums.length-1;
const traversal = function(nums,left,right){
if(left>right) return null
let mid = Math.floor((left+right)/2)
const node = new TreeNode(nums[mid])
node.left = traversal(nums,left,mid-1)
node.right = traversal(nums,mid+1,right)
return node
}
const root = traversal(nums,0,right)
return root
};
学习内容:● 538.把二叉搜索树转换为累加树
https://programmercarl.com/0538.%E6%8A%8A%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%B4%AF%E5%8A%A0%E6%A0%91.html
视频讲解:https://www.bilibili.com/video/BV1d44y1f7wP
反中序遍历这个二叉树(右中左),然后顺序累加
convert(root)
return root
//写成return convert(root)???
var convertBST = function(root) {
let pre = 0
const convert = function(root){
if(root==null)return
convert(root.right)
root.val = root.val+pre
pre = root.val
convert(root.left)
}
convert(root)
return root
};
学习内容:总结篇
https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E6%80%BB%E7%BB%93%E7%AF%87.html
涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。