1.单值二叉树
//如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 // // 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 // // // // 示例 1: // 1 // / \ // 1 1 // / \ \ // 1 1 1 // // 输入:[1,1,1,1,1,null,1] //输出:true // // // 示例 2: // 2 // / \ // 2 2 // / \ // 5 2 // 输入:[2,2,2,5,2] //输出:false // // // // // 提示: // // // 给定树的节点数范围是 [1, 100]。 // 每个节点的值都是整数,范围为 [0, 99] 。 // // Related Topics 树
class Solution {
int ans;
public boolean isUnivalTree(TreeNode root) {
ans = root.val;
boolean helper = helper(root);
return helper;
}
private boolean helper(TreeNode root){
if(root == null){
return true;
}
if(root.left != null && root.left.val != ans){
return false;
}
if(root.right != null && root.right.val != ans){
return false;
}
return helper(root.left) && helper(root.right);
}
}
2.二叉树的堂兄弟节点
//在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 // // 如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。 // // 我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。 // // 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。 // // // // 示例 1: // 1 // / \ // 2 3 // \ \ // 4 5 // 输入:root = [1,2,3,4], x = 4, y = 3 //输出:false // // // 示例 2: // 1 // / \ // 2 3 // \ // 4 // 输入:root = [1,2,3,null,4,null,5], x = 5, y = 4 //输出:true // // // 示例 3: // // // // 输入:root = [1,2,3,null,4], x = 2, y = 3 //输出:false // // // // 提示: // // // 二叉树的节点数介于 2 到 100 之间。 // 每个节点的值都是唯一的、范围为 1 到 100 的整数。 // // // // Related Topics 树 广度优先搜索
用广度优先遍历反而还更复杂了,我们直接使用两个HashMap,将每个节点的值和其对应的深度以及父节点给记录下来,这样我们直接从HashMap中就能直接通过键(节点的值)获取深度和父节点的信息。
class Solution {
HashMap<Integer, Integer> depth;
HashMap<Integer, TreeNode> parent;
public boolean isCousins(TreeNode root, int x, int y) {
depth = new HashMap<>();
parent = new HashMap<>();
dfs(root, null);
return depth.get(x)==depth.get(y) && parent.get(x) != parent.get(y);
}
private void dfs(TreeNode node, TreeNode par){
if(node != null){
depth.put(node.val,par == null ? 0 : 1 + depth.get(par.val)+1);
parent.put(node.val, par);
dfs(node.left, node);
dfs(node.right, node);
}
}
}