前言
本周是学习java的第二周,本周我学习了关于重写,封装,多态等等一系列东西,对于java有了更深刻的理解,也学习了数据结构的一部分知识,能够独立完成力扣的简单普通题,困难题需要挑着解答。
参考教程:
本周学习要点:
1.super(),在继承父类后子类重写父类的属性方法后想访问父类的属性方法时可以使用super()
2.对于封装,private一个属性后想在其他类中给它设置一个值时可以写一个set(Name)的方法,在eclipse中右键source内有一键生成private属性的set和get方法,在private属性过多时可以节省时间。封装是为了不让外部轻易访问修改到其属性的值。
3.关于多态,可以重载方法使得父类无法传入,也可以直接传入父类使得子类都可以引用方法。如有一个Animal
父类,Dog
,Cat
子类,父类有一个方法shout,可以另写一个方法animalShout传入类参数,方法内调用类的方法。
4.final修饰变量则变为常量,修饰方法则方法不可被子类重写,但可重载,不可被继承。
5.重写与重载:重写发生在子类与父类间子类重新写父类的方法;重载发生在同一类间,重载同一方法——重写与重载的区别。
6.抽象类:定义抽象方法时类也必须加abstract
,仍可以定义其他方法。父类无需实现但子类必须重写父类的抽象类,可以严格的限制子类。抽象类无法new,只能被子类继承调用其方法属性。抽象类是为了给子类提供模板而存在的。
恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
示例 1:
示例 2:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/recover-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
先放我的代码:
/**
* 力扣中关于二叉树的默认定义
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode one = null; //逆序中大的值
TreeNode two = null; //逆序中小的值
TreeNode pre = null; //上一个节点
int temp;
public void recoverTree(TreeNode root) {
order(root); //中序遍历找出逆序的两个数
temp = one.val;
one.val = two.val;
two.val = temp;
}
public void order(TreeNode root){
if(root==null) return;
if(root.left!=null){
order(root.left);
}
if(pre!=null && pre.val > root.val){
if(one==null){
one=pre;
two=root;
}
else{
two=root;
}
}
pre=root;
if(root.right!=null){
order(root.right);
}
}
}
又是一道二叉树问题,做了几道后发现二叉树问题一般都是可以用递归解决的,所以思路就很明确了,递归!!
通过之前对二叉树的了解我知道了二叉树的遍历有:
先序遍历,中序遍历,后序遍历,层次遍历。
而题目又说的很明确,二叉搜索树!!对于二叉搜索树,百度百科有很清晰的解释:
这样的话解法就很清晰了,中序遍历+递归。先递归到最小的一个节点,从这个节点开始判断,若这个节点前一个数大于当前节点就说明有冲突,这两个数就是我们要找的数了。然鹅梦想是美好的现实是残酷的,没这么简单,我的想法仅限于相邻的两个数之间的交换,不得已看了一下官方题解,发现两个数冲突叫做逆序,而这个逆序有两种可能性,一种是相邻之间的逆序,一种是相隔几个数的逆序,前者会产生一组逆序的数字,后者会产生两组逆序的数组,因此需要在逆序那里多加一次判断,第一次逆序时把one赋给pre,也就是较大的值,root赋给two;第二次逆序时把root再次赋给two。如此一来,可以确保one里面存的就是大的那个数,two存的是小数。退出递归后
recoverTree
方法仅仅是把one.val和two.val交换即可恢复二叉搜索树。
下周学习任务
完成力扣N皇后问题。这一题要学到回溯算法,这题好像也是一道极其经典的题目,初看完全懵逼,相比于二叉树问题实在是难得很。这题在本周就研究许久但发现我水平不够还无法解出来,希望下周能解出来把。。。