vlambda博客
学习文章列表

【DFS】993. 二叉树的堂兄弟节点 (简单)

让我们先看一下这道题目

我们可以从题目中得到这个重要信息:

   0.  给定的两个节点必须处于同一深度才有可能返回true;

  1. 给定的两个节点的父节点不能是同一个,否则就是亲兄弟节点。


经过思考,不难发现这道题目最快的做法应该是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版本的答案之后我会补上,希望有不同思路的同学前来讨论研究~