原题说明
In a binary tree, the root node is at depth 0, and children of each depth k node are at depth k+1
.
Two nodes of a binary tree are cousins if they have the same depth, but have different parents.
We are given the root of a binary tree with unique values, and the values x and y of two different nodes in the tree.
Return true if and only if the nodes corresponding to the values x and y are cousins.
Example 1:
Input:
root = [1,2,3,4], x = 4, y = 3
Output:false
Example 2:
Input:
root = [1,2,3,null,4,null,5], x = 5, y = 4
Output:true
Example 3:
Input:
root = [1,2,3,null,4], x = 2, y = 3
Output:false
Note:
- The number of nodes in the tree will be between 2 and 100.
- Each node has a unique integer value from 1 to 100.
解题思路
因为要判断两个节点是否同层,想到用BFS逐层扫描.
对于每一层的节点:
1) 用has_x
和has_y
代表x
和y
是否出现在本层
2) 判断该节点的子节点是否同时是x
和y
,如果是,说明x和y是兄弟节点,而非cousin节点,直接return false
3) 该层扫描结束后,如果has_x和has_y同时为true,说明x和y同时出现在该层,return true
4) 该层扫描结束后,如果has_x和has_y仅有一个为true,则x和y必然在不同层,return false
整棵树扫描结束后,如果还是没有返回,说明之前并未遇到过x或y中任何一个,return false
示例代码 (cpp)
1 | class Solution { |
复杂度分析
时间复杂度: O(n)
空间复杂度: O(log(n))
归纳总结
这道题重点要理解题意,cousin节点之间必须在同一层,且父节点不同。官网的解答空间复杂度不高,且整个想法不够直观,不是很推荐。
我们在Youtube上更新了视频讲解,欢迎关注!