通过JavaScript刨析二叉树03:判定二叉搜索树

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

前言

二叉树,树实际上是一种,链表得扩展,之前有得链表是单向得,如果这个链表不是单向得,它有多个指向(N),这就是一棵树(Tree),树得这种结构,不管是在工作还是生活都随处可见,比如文件夹得格式,公司得组织架构图,以及虚拟Dom等等。

什么是二叉搜索树

二叉搜索树在二叉树的基础上加了一些限制,这些限制是每个节点的值,都大于Left左子树所有的值,同时小于Right右子树所有的值,以此类推

graph TB 
A[15]
A --> B[11] 
A --> C[20]
B --> E[8]
B --> F[10]
C --> D[13]
C --> G[19]

验证二叉搜索树

方式有两种,一种是迭代,另一种是递归方式,但最简单的方式是中序遍历,它是一个有序的递增,从左边开始到钟间,最后到右边,随后判断当前的这一组是否是符合规则,

递归

  1. 定义递归函数,并且传入,分别传入当前的跟节点和根节点的左子树和右子树
function isChatTree(temp,left,right){
  if(!temp){
    return true;
  }
}
  1. 如果当前根节点为空,则证明它是二叉搜索树
if(temp.child <= left || temp.child>= right){
    return false
}
  1. 如果当前子节点小于左子树节点值或者当前节点小于右子树值,则说明它不是二叉搜索树
return isChatTree(temp.left,left)
return isChatTree(temp.right,right)
  1. 入口和出口都不符合 上述两个判断都不符合,那么就进行递归,分别传入它的第一个参数为:左右子树temp.left,和temp.right,第二个参数它的左根节点和右根节点分别继承父根节点,所这个参数是传入的leftright
return isChatTree(temp.left,left)
  1. 第三个参数,传入最大值,左子树取当前值和传入的值进行比较,取最大的值传入,相反右侧的值取当前值和传入值之间的最小值
return isChatTree(temp.left,left,Math.min(right,temp.child)) && isChatTree(temp.right,Math.max(right,temp.child),right)

因为是判断左右子树,所以需要两个递归进行逻辑与&&判定