Morris遍历-
- 验证二叉搜索树
- 题目描述
- Morris 遍历解题
- 代码演示:
- morris 遍历改写后序遍历
验证二叉搜索树
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例1:
输入:root = [2,1,3]
输出:true
示例2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
Morris 遍历解题
不了解morrisb遍历的可以看遍历二叉树的神级方法–Morris遍历
采用morris 遍历的好处就是,时间复杂度是O(n) 空间复杂度是O(1).和递归遍历树的好处就是,节省了空间,但是造成代码更复杂,流程也更复杂了,因此这当做一个扩展知识,
首先我们知道搜索二叉树,满足在中序遍历时是递增的,因为中序遍历顺序是左头右的顺序,刚好满足搜索树的递增条件,
因此解决用morris 遍历解决这个题,只需要在morris 遍历时,构造出中序遍历,就可以判断了,
morris 遍历改写前序和中序遍历可以查看
二叉树Morris遍历改写成前序遍历和中序遍历
代码演示:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isValidBST(TreeNode root) {if (root == null){return true;}TreeNode cur = root;TreeNode mostRight = null;Integer pre = null;boolean ans = true;while (cur != null){mostRight = cur.left;if (mostRight != null){while (mostRight.right != null && mostRight.right != cur){mostRight = mostRight.right;}if (mostRight.right == null){mostRight.right = cur;cur = cur.left;continue;}else{mostRight.right = null;}}if (pre != null && pre >= cur.val){ans = false;}pre = cur.val;cur = cur.right;}return ans;}
}
morris 遍历改写后序遍历
二叉树Morris遍历改写成后序遍历