965. 单值二叉树
题目描述
思路:广度优先搜索
我们先进行一次深度优先搜索,获取这颗树中的所有节点的值。然后,就可以判断所有节点的值是不是都相等了。
代码:
class Solution {
List<Integer> vals;
public boolean isUnivalTree(TreeNode root) {
vals = new ArrayList();
dfs(root);
for (int v: vals)
if (v != vals.get(0))
return false;
return true;
}
public void dfs(TreeNode node) {
if (node != null) {
vals.add(node.val);
dfs(node.left);
dfs(node.right);
}
}
}
938. 二叉搜索树的范围和
题目描述
方法一:无脑法
代码:
class Solution {
List<Integer> list=new ArrayList<Integer>();
int sum=0;
int temp=0;
public int rangeSumBST(TreeNode root, int low, int high) {
addValue(root);
for(int i=0;i<list.size();i++){
temp=(Integer)list.get(i);
if(low<=temp&&temp<=high){
sum+=temp;
}
}
return sum; }
public void addValue(TreeNode node){
if(node==null){
return;
}
if(node!=null){
list.add(node.val);
}
addValue(node.left);
addValue(node.right);
}
}
方法二
思路:深度优先搜索
具体代码
class Solution {
public int rangeSumBST(TreeNode root, int low, int high) {
if (root == null) {
return 0;
}
if (root.val > high) {
return rangeSumBST(root.left, low, high);
}
if (root.val < low) {
return rangeSumBST(root.right, low, high);
}
return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
}
}
530. 二叉搜索树的最小绝对差
题目描述
思路:中序遍历
方法一:无脑法
class Solution {
List list=new ArrayList();
public int getMinimumDifference(TreeNode root) {
zxbl(root);
int min=Integer.MAX_VALUE;;
for(int i=0;i<list.size()-1;i++){
min=Math.min((Integer) list.get(i+1)-(Integer) list.get(i),min);
}
return min; }
public void zxbl(TreeNode node){
if(node==null){
return;
}
if(node.left!=null){
zxbl(node.left);
}
list.add(node.val);
if(node.right!=null){
zxbl(node.right);
}
}
}
方法二:
思路与算法
本题要求二叉搜索树任意两节点差的绝对值的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。
朴素的方法是经过一次中序遍历将值保存在一个数组中再进行遍历求解,我们也可以在中序遍历的过程中用 \textit{pre}pre 变量保存前驱节点的值,这样即能边遍历边更新答案,不再需要显式创建数组来保存,需要注意的是 \textit{pre}pre 的初始值需要设置成任意负数标记开头,下文代码中设置为 -1。
代码
class Solution {
int pre;
int ans;
public int getMinimumDifference(TreeNode root) {
ans = Integer.MAX_VALUE;
pre = -1;
dfs(root);
return ans;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
if (pre == -1) {
pre = root.val;
} else {
ans = Math.min(ans, root.val - pre);
pre = root.val;
}
dfs(root.right);
}
}