【DFS】993. 二叉树的堂兄弟节点 (简单)
让我们先看一下这道题目
我们可以从题目中得到这个重要信息:
0. 给定的两个节点必须处于同一深度才有可能返回true;
给定的两个节点的父节点不能是同一个,否则就是亲兄弟节点。
经过思考,不难发现这道题目最快的做法应该是BFS,但是由于本人对BFS理解不深刻,之后会补充BFS版本,先上一个DFS版本吧
我们设置两个map,一个用来存储当前节点的值和对应的深度,另一个用来存储当前节点的值和对应的父节点
private Map<Integer, Integer> depthMap = new HashMap<>();
private Map<Integer,TreeNode> parentMap = new HashMap<>();
设置成成员变量,在进行dfs时,可以少传递参数。
在遍历二叉树的时候,用前序,中序,后序遍历都可以,在这里我们使用前序遍历
private void dfs(TreeNode node, TreeNode parent){
if(node == null){
return;
}
depthMap.put(node.val, parent == null ? 0 : depthMap.get(parent.val) + 1);
parentMap.put(node.val, parent);
dfs(node.left, node);
dfs(node.right, node);
}
所以这道题目的完整版本应该是这样
class Solution {
//用双map来缓存数据
private Map<Integer, Integer> depthMap = new HashMap<>();
private Map<Integer,TreeNode> parentMap = new HashMap<>();
public boolean isCousins(TreeNode root, int x, int y) {
dfs(root, null);
return depthMap.get(x) == depthMap.get(y) && parentMap.get(x) != parentMap.get(y);
}
private void dfs(TreeNode node, TreeNode parent){
if(node == null){
return;
}
depthMap.put(node.val, parent == null ? 0 : depthMap.get(parent.val) + 1);
parentMap.put(node.val, parent);
dfs(node.left, node);
dfs(node.right, node);
}
}
今天的每日一题就到此结束了,BFS版本的答案之后我会补上,希望有不同思路的同学前来讨论研究~