二叉树搜索树--leetcode
来源:互联网 发布:剑三抢激活码软件 编辑:程序博客网 时间:2024/06/06 19:22
二叉搜索树定义
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less >than the node’s key.
The right subtree of a node contains only nodes with keys >greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
先来踩坑
if(root == null) return true; if(root.left == null && root.right == null) return true; if(root.left == null) return root.val < root.right.val && isValidBST(root.right); if(root.right == null) return root.val > root.left.val && isValidBST(root.left); return root.left.val < root.val && root.val < root.right.val && isValidBST(root.right) && isValidBST(root.left);
上述解法是第一反应,说明了大多数第一反应是不可靠的,继续修炼^-^
上述算法错在只考虑了当前结点及其左右子节点的数值大小关系,跟二叉搜索树的定义相差了十万八千里。
下面记录正确的解法
中序遍历法:
利用递归进行遍历,list储存遍历结果,判断是否是二叉搜索树是基于中序遍历结果是否为严格单调递增序列。
public boolean isValidBST(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); isvalidbst(root,list); for(int i = 0;i < list.size()-1;i++){ if(list.get(i) >= list.get(i + 1)) return false; } return true; }public void isvalidbst(TreeNode root,List<Integer> list){ if(root == null) return; isvalidbst(root.left,list); list.add(root.val); isvalidbst(root.right,list); }
利用栈进行中序遍历,中间需要用到一个pre的引用,来指向当前节点的父亲节点,思想是中序遍历出的序列一定是单调递增的序列。
public boolean isValidBST(TreeNode root) { if (root == null) return true; Stack<TreeNode> stack = new Stack<>(); TreeNode pre = null; while (root != null || !stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } root = stack.pop(); if(pre != null && root.val <= pre.val) return false; pre = root; root = root.right; } return true; }
还有一种方法,思路是给需要遍历的子树指定最大最小值,对于左子树,最大值不能超过其父节点,对于右子树,最小值要大于父节点。
public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBST(TreeNode root, long minVal, long maxVal) { if (root == null) return true; if (root.val >= maxVal || root.val <= minVal) return false; return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal); }
阅读全文
0 0
- 二叉树搜索树--leetcode
- leetcode 669二叉搜索树
- 二叉树系列四:Leetcode#98判断二叉树是否为二叉搜索树(BST)
- [LeetCode] 从排序的单链表到平衡搜索二叉树
- LeetCode | Recover Binary Search Tree(恢复二叉搜索树)
- LeetCode—判断是否为二叉搜索树
- LeetCode 333. Largest BST Subtree(最大二叉搜索树)
- LeetCode OJ-226. Invert Binary Tree(反转二叉搜索树)
- leetcode试题之求二叉搜索树的个数
- 二叉搜索树的判断 leetcode原题
- LeetCode 654 Maximum Binary Tree(构建二叉搜索树)
- LeetCode--Validate Binary Search Tree(二叉搜索树)
- leetcode Trim a Binary Search Tree 修剪二叉搜索树
- 每天一道LeetCode-----实现二叉搜索树的迭代器
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 关于ProgressBar的美化问题
- C#梳理【多线程Thread】
- Cocos2dx 3.x 屏幕适配
- NC6.5创建单表树卡单据(注意事项)
- jsp+springmvc+spring+mybatis+oracle
- 二叉树搜索树--leetcode
- Hdu 6214 Smallest Minimum Cut(最小割)
- 期刊投稿流程
- 小程序 按钮Button样式
- 井通区块链开发指南
- entOS 6.5下高版本Firefox和selenium报错问题
- Tyvj4875:排列 (单调栈)
- Android Studio使用SVN时添加忽略文件
- linux服务器编译命令