每天一道算法题验证二叉搜索树(深度优先搜索)

Posted 码农之屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一道算法题验证二叉搜索树(深度优先搜索)相关的知识,希望对你有一定的参考价值。

是新朋友吗?记得先点蓝字关注我哦~


深度优先搜索算法知识普及


深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。
因发明「深度优先搜索算法」,约翰 · 霍普克洛夫特与罗伯特 · 塔扬在1986年共同获得计算机领域的最高奖:图灵奖。

题目描述


给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
  • 节点的左子树只包含小于当前节点的数。

  • 节点的右子树只包含大于当前节点的数。

  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:
输入:
    2
   /
  1   3
输出: true
示例 2:
输入:
    5
   /
  1   4
     /
    3   6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。

解决思路


算法:
乍一看,这是一个平凡的问题。 只需要遍历整棵树,检查 node.right.val > node.val 和node.left.val < node.val 对每个结点是否成立。
【每天一道算法题】验证二叉搜索树(深度优先搜索)
问题是,这种方法并不总是正确。 不仅右子结点要大于该节点,整个右子树的元素都应该大于该节点。 例如:


【每天一道算法题】验证二叉搜索树(深度优先搜索)
这意味着我们需要在遍历树的同时保留结点的上界与下界,在比较时不仅比较子结点的值,也要与上下界比较。
上述思路可以用递归法实现。首先将结点的值与上界和下界(如果有)比较。然后,对左子树和右子树递归进行该过程。
步骤1:
【每天一道算法题】验证二叉搜索树(深度优先搜索)
步骤2:
【每天一道算法题】验证二叉搜索树(深度优先搜索)
步骤3:
【每天一道算法题】验证二叉搜索树(深度优先搜索)
步骤4:
复杂性分析:
  • 时间复杂度 :  O(N) 每个结点访问一次。
  • 空间复杂度 :  O(N) 我们跟进了整棵树。

Java代码实现


class TreeNode { int val; TreeNode left; TreeNode right;
TreeNode(int x) { val = x; }}
public class Solution { public boolean isValidBST(TreeNode root) { return helper(root, null, null); }
private boolean helper(TreeNode root, Integer lower, Integer higher) { if (root == null) { return true; }
int value = root.val; if (lower != null && value <= lower) { return false; }
if (higher != null && value >= higher) { return false; }
if (!helper(root.right, value, higher)) { return false; }
if (!helper(root.left, lower, value)) { return false; }
return true;    }}



看完本文有收获?请分享给更多的人

在技术成长的路上,让我们一起进步吧

以上是关于每天一道算法题验证二叉搜索树(深度优先搜索)的主要内容,如果未能解决你的问题,请参考以下文章

小Y学算法⚡️每日LeetCode打卡⚡️——28.二叉树的最大深度

从简单二叉树问题重新来看深度优先搜索

简述深度优先搜索遍历的方法。

Python算法系列—深度优先遍历算法

二叉树深度优先搜索n个台阶,一次走一步,走两步,走三步,有多少种可能

算法二叉树相关算法