题解 | #判断是不是二叉搜索树#
判断是不是二叉搜索树
https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b
# class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param root TreeNode类 # @return bool布尔型 # import sys class Solution: pre = -sys.maxsize - 1 # def isValidBST(self , root: TreeNode) -> bool: # # write code here # """method_1: 递归实现 # 思路:中序递归遍历, # 步骤: # step1: 递归到最左,初始化maxLeft和pre # step2: 往后遍历整棵树, 依次连接pre与当前节点,并更新pre; # step3: 左子树如果不是二叉搜索树返回false # step4: 判断当前节点是不是小于前置节点,更新前置节点。 # step5: 最后由右子树后面节点决定。 # """ # if not root: # return True # # left tree # if not self.isValidBST(root.left): # return False # if root.val <= self.pre: # return False # # update current value # self.pre = root.val # # enter right tree # if not self.isValidBST(root.right): # return False # return True def isValidBST(self, root: TreeNode) -> bool: """ method_2: 非递归思路 思路: 使用栈代替递归。 每次访问最左元素不止对二叉树成立,而是对所有子问题都成立,循环时最开始都是遍历最左 步骤: step1: 判断树空,空树不遍历; step2: 准备数组记录中序遍历的结果; step3: 准备辅助栈,当二叉树节点为空了且栈中没有节点,就停止访问; step4: 从根节点开始,每次优化进入每棵子树的最左边节点,将其不断加入栈中,用来保存父问题; step5. 到达最左后,可一开始访问,如果还有右节点,则将右边也加入栈中,之后右子树的访问也是有先导最左; step6: 遍历数组,依次比较相邻两个元素是否为递增序 """ tmp_stack, sort_list = list(), list() head = root while head or tmp_stack: while head: tmp_stack.append(head) head = head.left head = tmp_stack[-1] tmp_stack.pop() sort_list.append(head.val) head = head.right for i in range(1, len(sort_list)): if sort_list[i - 1] > sort_list[i]: return False return True pass pass 假笑王子