LeetCode算法学习之--Recursion--验证二叉搜索树

896 阅读2分钟

大家好今天给大家分享下一道 LeetCode 中等难度 的题目98. 验证二叉搜索树

题目

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3] 输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。

分析

1.左子节点小于当前节点

2.右子节点大于当前节点

3.整个树都要满足左边子节点大于右边子节点

4.返回boolean值

解法

1.递归

2.迭代

解法一:递归

思路
1.因为是二叉搜索树 所以中序遍历一定是一个升序数组
2.所以先中序遍历
3.再判断是否为升序数组
*/
var isValidBST = function (root) {
  const res = [];
  let isValid = true;
  function recursion(root) {
    if (!root) return;
    recursion(root.left);
    if (res.includes(root.val)) {
      isValid = false;
    }

    res.push(root.val);
    isValid = isValid && isAscending(res);
    recursion(root.right);
  }

  recursion(root);

  function isAscending(res) {
    const newArr = [...res];

    return newArr.sort((a, b) => a - b).join("") === res.join("");
  }

  return isValid;
};

/* 复杂度
时间 O(n^2Logn)
空间 O(nlogn)
*/

解法二:迭代

思路
1.和递归思路一样只是在中序遍历的时候使用了 迭代的方式
*/

var isValidBST = function (root) {
  const res = [];
  const stack = [];
  let isValid = true;
  while (root || stack.length) {
    while (root) {
      stack.push(root);
      root = root.left;
    }
    root = stack.pop();
    if (res.includes(root.val)) {
      isValid = false;
    }
    res.push(root.val);
    isValid = isValid && isAscending(res);
    root = root.right;
  }

  function isAscending(res) {
    const newArr = [...res];

    return newArr.sort((a, b) => a - b).join("") === res.join("");
  }
};

/* 复杂度
时间 O(n^2Logn)
空间 O(nlogn)
*/

总结

今天这道题是主要是练习中序遍历和判断升序数组

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com