993. 二叉树的堂兄弟节点
难度: 简单
题目:
在二叉树中,根节点位于深度
0
处,每个深度为k
的节点的子节点位于深度k+1
处。如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点
root
,以及树中两个不同节点的值x
和y
。只有与值
x
和y
对应的节点是堂兄弟节点时,才返回true
。否则,返回false
。提示:
- 二叉树的节点数介于
2
到100
之间。- 每个节点的值都是唯一的、范围为
1
到100
的整数。示例 1:
输入:root = [1,2,3,4], x = 4, y = 3 输出:false
分析
根据题目的意思,我们只需要找到x和y并判断两个节点是不是在同一层并且比较他们的父节点就可以,所以我们可以用dfs解决,记录三个参数,一个是当前节点,一个是父节点,还有一个是层数,如果第一次找到了x或者y,那么我们记录一下他的父亲节点和深度,再次遍历到x或者y的时候,就判断一下深度是不是一样的并且父亲节点是不是不一样,如果两个条件都成立,那么就肯定是堂兄弟节点了,直接返回true就可以了,我们可以做一个小优化,如果第一次找到了x或者y那么更深的节点是不需要找的,直接返回false,如果另外一个节点在下面,就是false,如果同一层,那么就找到并返回true,如果在上面,也会找到,并返回false,这样就可以了
dfs
class Solution {
public:bool isCousins(TreeNode* root, int x, int y) {int dep = 0;TreeNode* father = nullptr;bool has_found = false;function<bool(TreeNode*, TreeNode*, int)> dfs = [&](TreeNode* u, TreeNode* fa, int d) -> bool {if (!u || dep && d > dep) return false; // 更深的点就不用找了if (u->val == x || u->val == y) {if (dep) {has_found = (dep == d && fa != father);return has_found;}father = fa;dep = d;}return has_found ? has_found : (dfs(u->right, u, d + 1) || dfs(u->left, u, d + 1));};return dfs(root, nullptr, 0);}
};
时间复杂度: O ( n ) O(n) O(n)
结束了