DFS993. 二叉树的堂兄弟节点 (简单)

Posted 煮雪烧茶的刷题日记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS993. 二叉树的堂兄弟节点 (简单)相关的知识,希望对你有一定的参考价值。

让我们先看一下这道题目

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

   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版本的答案之后我会补上,希望有不同思路的同学前来讨论研究~

以上是关于DFS993. 二叉树的堂兄弟节点 (简单)的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]993. 二叉树的堂兄弟节点(Java/c++ DFS)

[LeetCode]993. 二叉树的堂兄弟节点(Java/c++ DFS)

LeetCode 993 二叉树的堂兄弟节点[DFS 回溯] HERODING的LeetCode之路

993. 二叉树的堂兄弟节点

力扣每日一题:993. 二叉树的堂兄弟节点(简单)

⭐算法入门⭐《二叉树》简单07 —— LeetCode 993. 二叉树的堂兄弟节点