530_二叉搜索树的最小绝对差(看题解了)
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
提示:树中至少有 2 个节点。
算法思想:
1、二叉排序树,中序遍历后是一个递增有序数组,可以转化为数组之后操作。
2、中序遍历,设置一个全局变量指向当前节点的前驱节点,求差值。
代码:
class Solution {
int ans = 100000;
TreeNode pre = null;
public void inorder(TreeNode root) {
if (root == null)
return;
inorder(root.left);
if (pre != null) {
int temp = Math.abs(pre.val - root.val);
if (temp < ans)
ans = temp;
}
pre = root;
inorder(root.right);
}
public int getMinimumDifference(TreeNode root) {
/*
* 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
*
* 差值是一个正数,其数值等于两值之差的绝对值。
*/
inorder(root);
return ans;
}
}
注意:
学会在递归中如何记录前一个节点。
题目:501_二叉搜索树中的众数(看了题解)
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
#
算法思想:
注意利用线索二叉树的特性。
重复的数据是连续访问到的。因此只用定义一个变量 count,记录当前元素出现的次数。
如果当前元素为第一个元素,或者,当前元素不等于前驱节点,count 值置为1;
否则,即 当前节点等于前驱节点,count ++;
再依据当前节点的 count 值,判断是否更新众数。
如果当前 count== maxcount,
如果当前count > maxcount ,则需要更新所有众数,之前获得的众数被取代。清空 list,将当前节点加入 list,更新;
最后,手动把 ArrayList 转为 int[] ;
代码:
import javax.imageio.stream.ImageInputStream;
import java.util.ArrayList;
public class Solution2 {
TreeNode pre = null;
int count = 0, maxcount = 1;
ArrayList<Integer> ans = new ArrayList<Integer>();
public void inorder(TreeNode root) {
if (root == null) return;
inorder(root.left);
//更新 count 值
if (pre == null||root.val!=pre.val) count = 1;
else count++;
//找出众数
if(count>maxcount){
ans.clear();;
ans.add(root.val);
maxcount=count;
}else if(count==maxcount){
ans.add(root.val);
}
pre = root; //更新前驱指针
inorder(root.right);
}
public int[] findMode(TreeNode root) {
inorder(root);
int list[] = new int[ans.size()]; //把 ArrayList 手动转数组
for (int i = 0; i < ans.size(); i++) {
list[i] = ans.get(i);
}
return list;
}
public static void main(String[] args) {
TreeNode t1 = new TreeNode(1,null,null);
int [] ans = new Solution2().findMode(t1);
for (int i = 0; i < ans.length; i++) {
System.out.println(ans[i]);
}
}
}
算法思想:
题目:236_二叉树的最近公共祖先(看了题解)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
算法思想:
题目规定给定结点不同且一定有公共祖先结点。
采用计算型后序递归,递归终止条件1、结点为空,返回空;2、节点为p或q,返回p、或q。
退出时处理当前节点,若当前节点1、左子树和右子树返回值都不为空,返回当前节点;2、左子树不空返回左子树;3、右子树不用返回右子树。
代码:
public class Solution {
//算法思想,后序遍历,遇到p、q 将结点返回,如果当前节点左右子树返回值都不为空,表示当前节点是pq公共祖先。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return null;
if(root ==p||root==q) return root; //第一次访问节点,判断该节点是不是p、q若是则递归终止,返回结点
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 left;
else if(left==null&&right!=null) return right;
else return null;
}
}