题解 | #判断是不是二叉搜索树#
判断是不是二叉搜索树
https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b
问:怎么确定三个小问题顺序的?为什么采用中序遍历?
答:由函数功能和确定顺序两方面确定。
一、主语:函数功能
- 搜索树定义:我这个节点大于左子树全部节点,右子树全部节点大于我。
- 我这个函数要解决的问题:我这一整棵树是不是搜索树。
- 划分成三个顺序未知的小问题:
- 1.我这个节点是否符合大于左子树全部节点,小于右子树全部节点;
- 2.左子树是不是搜索树(调自己);
- 3.右子树是不是搜索树(调自己)。
二、主语:确定顺序
- 搜索树特点:中序遍历时递增。即中序遍历时,我这个节点大于左子树的尾节点,右子树第一个节点大于我。
- 借助搜索树的特点,如果用中序遍历,三个小问题的顺序变为:左子树是不是搜索树,我这个节点符不符合条件,右子树是不是搜索树。那么小问题1便简化为了“我是否大于左子树尾节点,右子树第一个节点是否大于我“。
package main //import "fmt" import . "nc_tools" var pre *TreeNode func isValidBST( root *TreeNode ) bool { // write code here if root == nil { return true } if !isValidBST(root.Left) { return false } if pre == nil { pre = root } else { if root.Val<=pre.Val { return false } pre = root } return isValidBST(root.Right) }