代码随想录算法训练营第二十天|二叉树part6

89 阅读1分钟

654.最大二叉树

题目链接

leetcode.cn/problems/ma…

第一想法

找到最大的值,将左右作为两个数组,再递归遍历,构建二叉树

思路

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.二叉搜索树中的搜索

题目链接

leetcode.cn/problems/se…

思路

二叉搜索树的特性是,左子树全部小于根节点,右子树全部大于根节点

因此,递归三部曲:

  • 确定函数的参数和返回值

    这里参数是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.验证二叉搜索树

题目链接

leetcode.cn/problems/va…

思路

直接对树进行中序遍历,将结果放到数组中

如果数组是递增的,则属于二叉搜索树

代码如下:

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;
};

这里遍历二叉树可以直接用一个箭头函数!

判断数组递增的这个方法非常方便