LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树
微信搜一搜:
bigsai
大家都在关注的刷题、学习数据结构和算法宝藏项目
关注回复进群即可加入力扣打卡群,欢迎划水。近期打卡:
LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历
LeetCode 96不同的二叉搜索树&95不同的二叉搜索树Ⅱ
LeetCode 97交错字符串(动态规划)
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:2/ \1 3
输出: true
示例 2:
输入:5/ \1 4/ \3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。
分析
二叉搜索树的中序遍历是一个递增序列,所以我们只需要进行二叉树的中序遍历查询序列是否一直有序即可。当然,如果你直接利用二叉搜索树的定义左节点<根节点<右节点的话当然也没问题。具体实现上,你可以先将中序序列求出来判断是否有序,也可直接利用一个临时存储上一个节点的值进行判断。
具体代码为:
// public boolean isValidBST(TreeNode root) {// List<Integer>list=new ArrayList<Integer>();
// dfs(root,list);
// if(list.size()<=1)return true;
// for(int i=1;i<list.size();i++)
// {// if(list.get(i)<=list.get(i-1))
// return false;
// }
// return true;
// }
// private void dfs(TreeNode root, List<Integer> list) {// // TODO Auto-generated method stub
// if(root==null)
// return;
// dfs(root.left, list);
// list.add(root.val);
// dfs(root.right, list);
// }
long pre=Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {if(root==null)return true;if(!isValidBST(root.left))return false;if(pre>=root.val)return false;pre=root.val;if(!isValidBST(root.right))return false;return true; }
恢复二叉搜索树
给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?
示例 1:
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例 2:
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
提示:
树上节点的数目在范围 [2, 1000] 内
-2^31 <= Node.val <= 2^31 - 1
分析:
这题主要是需要动手画一画分析。首先它告诉本来一个二叉搜索树有两个节点的值被交换,我们知道对应一个正常的二叉搜索树它的中序排序序列是有序递增的,那么要将它们的数值进行交换。
分析一个序列1 3 5 7 8 9 10
假如其中的3和9进行交换次序(选择模拟的时候要么选择非常远要么选择非常更直观)那么有两段逆序,两个分别可以确定大小点。如果两个相邻交换那么仅有一段逆序对,分别是交换的两个节点。
当然在具体实现的时候你可以根据位置进行记录,一旦到达第二个逆序就可以停止。这题中序遍历上你可以直接先一次求中序序列,然后找到两个逆序,第二次再去进行交换(O(n))。当然更好的方法是一次就去把这个过程搞完,需要借助一个前驱节点去比较前一个数(O(1))。
具体代码为:
// public void recoverTree(TreeNode root) {// List<Integer>list=new ArrayList<Integer>();
// dfs1(root,list);
// int l=-1,lvalue=0,r=-1,rvalue=0;
// for(int i=1;i<list.size();i++)
// {// if(list.get(i)<list.get(i-1))
// {// if(l==-1) {// l=i-1;
// lvalue=list.get(i-1);
// }
// r=i;
// rvalue=list.get(i);
// }
// }
// dfs2(root,l,lvalue,r,rvalue);
// }
// int index=0;
// private void dfs2(TreeNode root, int l, int lvalue, int r, int rvalue) {// if(root==null)
// return;
// dfs2(root.left, l, lvalue, r, rvalue);
// if(index>r)
// return;
// if(index==l)
// root.val=rvalue;
// else if(index==r)
// root.val=lvalue;
// index++;
// dfs2(root.right, l, lvalue, r, rvalue);
// }
// private void dfs1(TreeNode root, List<Integer> list) {// // TODO Auto-generated method stub
// if(root==null)
// return;
// dfs1(root.left, list);
// list.add(root.val);
// dfs1(root.right, list);
//
// }public void recoverTree(TreeNode root) {Stack<TreeNode> q1 = new Stack(); TreeNode first=null;TreeNode second=null;TreeNode pre=new TreeNode(Integer.MIN_VALUE);TreeNode t=root;while(!q1.isEmpty()||t!=null){if (t!=null) {q1.push(t);t=t.left;}else {t=q1.pop();//中序操作if(t.val<pre.val){if(first==null)first=pre;else {second=t;break;//可以停止了}second=t;}pre=t;//更新下pret=t.right;}}int team=first.val;first.val=second.val;second.val=team;}
原创不易,bigsai请你帮两件事帮忙一下:
star支持一下, 您的肯定是我在平台创作的源源动力。
微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。
记得关注、咱们下次再见!
LeetCode 98验证二叉搜素树(中序遍历)99恢复二叉搜索树相关推荐
- LeetCode,二叉搜素树
1. 修剪二叉搜索树 LeetCode569. 力扣 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中. ...
- 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表
一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...
- 中序遍历解决二叉搜索树问题
中序遍历解决二叉搜索树问题 Python3 树 深度优先搜索 通过中序遍历二叉搜索树得到的关键码序列是一个递增序列. 这是二叉搜索树的一个重要性质,巧妙利用这一性质可以解决一系列二叉搜索树问题. 本系 ...
- leetcode - 94. 二叉树的中序遍历
给定一个二叉树,返回它的中序遍历.中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历.中序周游.在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树. 示例: 进阶: 递归算法很简单, ...
- Leetcode 98:验证二叉搜索树
Leetcode 98:验证二叉搜索树 题目描述 我的解法:非递归的中序遍历 其它解法1:非递归的中序遍历,用LONG_MIN规避树的val等于INT_MIN的情况 其他解法2:递归的中序遍历思想 其 ...
- leetcode —— 98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- LeetCode 98 验证二叉搜索树
题目链接:力扣 思路 递归 递归函数声明 bool isValidBST(TreeNode* root,int lower,int upper);//判断根节点是否在lower和upper之间 递归出 ...
- leetcode 98. 验证二叉搜索树 递归遍历左右子树和中序遍历 c语言解法
如题: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是 ...
- LeetCode 98. 验证二叉搜索树 思考分析
题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二 ...
最新文章
- HR吐槽BAT员工:不要把平台的光环当成自己的,我们需要造火箭的。
- 连自己都不放过?六成应用开发不需要程序员!
- ajax怎么创建json对象,ajax jsonp我写的方法怎么调用不了? 为什么用$.getJSON方法能生成数据?...
- 图片日志:泛型的作用/hashset的内部实现/常见运行期异常
- 键盘输入Scanner类方法属性使用
- MarkDown 中使用 LaTeX 数学式
- 云服务器主体信息可以变更吗,云服务器备案号是什么?备案号存在能否更换云服务器?...
- 一个简单的动态web服务器
- Netty实战项目:Spring boot 程序的聊天程序
- centOS 8+VMwware配置(2)
- 靠着零代码报表工具,转行报表开发后月薪超过3万
- 在哪里学python-深圳学python人工智能培训去哪里
- 基于yolo3 与crnn 实现中文自然场景文字检测及识别
- 米思齐(Mixly)图形化系列教程(四)-运算符
- 智能远程监督系统解决方案
- 错误 LNK1104 无法打开文件“C:\Users\Administrator\Desktop\新建文件夹\ConsoleApplication1\x64\Debug\ConsoleApplicat
- python pygame字体设置_2015/11/3用Python写游戏,pygame入门(3):字体模块、事件显示和错误处理...
- webSphere介绍
- http和https的区别
- 解除Word的编辑保护【简单版】
热门文章
- 关于uWSGI服务器的安装和启动(一)
- Linux Kernel5.10的软中断(softirq)的本质
- [Issue Fixed]-Pulse r9.1 embedded browser install failure
- optee中spinlock的实现原理详解
- (67)多核同步,lock 总线锁 ,自己实现临界区
- Linux提权CVE-2022-0847分析
- C#获取一些常用目录
- Windows驱动开发学习笔记(三)—— 内核空间内核模块
- 限制Textarea文本域内容的长度
- HDU 1873 看病要排队(结构体+优先队列)