654.最大二叉树
题目链接
第一想法
找到最大的值,将左右作为两个数组,再递归遍历,构建二叉树
思路
var constructMaximumBinaryTree = function(nums) {
if(nums.length == 0) return null;
let nodeVal = Math.max(...nums);
let pos = nums.indexOf(nodeVal);
let leftNum = nums.slice(0,pos);
let rightNum = nums.slice(pos+1);
let root = new TreeNode(nodeVal);
root.left = constructMaximumBinaryTree(leftNum);
root.right = constructMaximumBinaryTree(rightNum);
return root;
};
这一题和上一题比较相似,都是利用递归遍历来构建二叉树
700.二叉搜索树中的搜索
题目链接
思路
二叉搜索树的特性是,左子树全部小于根节点,右子树全部大于根节点
因此,递归三部曲:
-
确定函数的参数和返回值
这里参数是root,返回值也是root
-
确定终止条件
如果root为空,或者找到了这个节点,就返回该root
-
确定单层递归逻辑
当前节点值大于target则往左
当前节点值小于target则往右
代码如下:
var searchBST = function(root, val) {
if( root == null || root.val === val ) return root;
else if(root.val > val){
return searchBST(root.left,val)
}else if(root.val < val){
return searchBST(root.right,val)
}
};
这里有一个小坑,括号里面的
root == null || root.val === val
顺序不能反,因为如果root此时已经等于null,就无法取root.val
98.验证二叉搜索树
题目链接
思路
直接对树进行中序遍历,将结果放到数组中
如果数组是递增的,则属于二叉搜索树
代码如下:
var isValidBST = function(root) {
let res = [];
function getArray(node){
if(node == null) return;
getArray(node.left);
res.push(node.val);
getArray(node.right);
}
getArray(root);
function isSort(arr){
for(let i = 0; i < arr.length; i++){
for(let j = i+1; j < arr.length; j++){
if(arr[i] >= arr[j]){
return false;
break;
}
}
}
return true;
}
return isSort(res);
判断数组是否递增定义了一个函数
精简一下代码:
var isValidBST = function (root) {
let arr = [];
const buildArr = (root) => {
if (root) {
buildArr(root.left);
arr.push(root.val);
buildArr(root.right);
}
}
buildArr(root);
for (let i = 0; i < arr.length; i++) {
if (arr[i] >= arr[i + 1])
return false;
}
return true;
};
这里遍历二叉树可以直接用一个箭头函数!
判断数组递增的这个方法非常方便