● 530.二叉搜索树的最小绝对差
1.思路
方法一:递归
最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。
其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。
需要用一个pre节点记录一下cur节点的前一个节点。
方法二:迭代
根本看不懂
2.代码实现
class Solution {
int result=Integer.MAX_VALUE;
TreeNode pre=null;
public int getMinimumDifference(TreeNode root) {
tranversal(root);
return result;
}
public void tranversal(TreeNode cur){
if(cur==null)
return;
tranversal(cur.left);
if(pre!=null)
{
result=Math.min(result,cur.val-pre.val);
}
pre=cur;
tranversal(cur.right);
}
}
● 501.二叉搜索树中的众数
1.思路
方法一:递归
分为不是二叉树的解法和根据二叉树的解法
只写了根据二叉树的解法。
这种写法优点在于 只需要遍历一遍。
2.代码实现
class Solution {
ArrayList<Integer> resList;
int maxcount;
int count;
TreeNode pre;
public int[] findMode(TreeNode root) {
resList=new ArrayList<>();
maxcount=0;
count=0;
pre=null;
findMode1(root);
int[] res=new int[resList.size()];
for(int i=0;i<resList.size();i++)
{
res[i]=resList.get(i);
}
return res;
}
public void findMode1(TreeNode cur){
if(cur==null)
return;
findMode1(cur.left);
if(pre==null){
count=1;
//System.out.println("pre=null count=1");
}
else if(pre.val==cur.val){
count++;
//System.out.println("pre.val==cur.val");
//System.out.println("count="+""+count);
}
else
{
count=1;
//System.out.println("pre.val!=cur.val");
// System.out.println("count=1");
}
if(count>maxcount){
//System.out.println("count>maxcount");
maxcount=count;
resList.clear();
resList.add(cur.val);
// System.out.println(resList);
}
else if(count==maxcount)
{
// System.out.println("count=maxcount");
resList.add(cur.val);
// System.out.println(resList);
}
pre=cur;
findMode1(cur.right);
}
}
● 236. 二叉树的最近公共祖先
1.思路
方法一:递归
1.求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。
2.在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
3.要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。
图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去!
2.代码实现
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null)
return null;
else if(root.val==p.val||root.val==q.val){
return root;
}
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left!=null && right!=null)
return root;
else if(left==null && right!=null)
return right;
else if(left!=null && right == null)
return left;
else
return null;
}
}