530.二叉搜索树的最小绝对差
题目链接/文章讲解:代码随想录
迭代
class Solution {
int result = Integer.MAX_VALUE;
TreeNode pre;
public int getMinimumDifference(TreeNode root) {
if(root == null) return 0;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()) {
if(cur != null) {
stack.push(cur);
cur =cur.left;
}
else {
cur = stack.pop();
if(pre != null) {
result = Math.min(result, cur.val - pre.val);
}
pre = cur;
cur = cur.right;
}
}
return result;
}
}
递归
class Solution {
int result = Integer.MAX_VALUE;
TreeNode pre;
public int getMinimumDifference(TreeNode root) {
if(root == null) return 0;
get(root);
return result;
}
public void get(TreeNode cur) {
if(cur == null) return ;
get(cur.left);//左
if(pre != null) {//中
result = Math.min(result, cur.val - pre.val);//双指针
}
pre = cur;
get(cur.right);//右
}
}
501.二叉搜索树中的众数
递归
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;
getFindMode(root);
int[] res = new int[resList.size()];
for(int i = 0; i < resList.size(); i++) {
res[i] = resList.get(i);
}
return res;
}
public void getFindMode(TreeNode cur) {
if(cur == null) return;
getFindMode(cur.left);//左
if(pre == null) count = 1;//计数
else if(pre.val == cur.val) count++;//相等计数加1
else count = 1;//不等计数为1 重新计数
if(count == maxCount) resList.add(cur.val);
if(count > maxCount) {
maxCount = count;
resList.clear();//清空
resList.add(cur.val);//加入新数
}
pre = cur;
getFindMode(cur.right);
}
}
236. 二叉树的最近公共祖先
题目:
递归
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q) return root;//终止条件
//递归整个二叉树
TreeNode left = lowestCommonAncestor(root.left, p, q);//左
TreeNode right = lowestCommonAncestor(root.right, p, q);//右
if(left == null && right == null) return null;//中 处理过程
else if(left == null) return right;
else if(right == null) return left;
else return root;
}
}