0x00 题目
在二叉树中,根节点位于深度 0 处
每个深度为 k 的节点的子节点位于深度 k+1 处
如果二叉树的两个节点 深度
相同
但 父节点
不同 ,则它们是一对 堂兄弟
节点
我们给出了具有 唯一
值的二叉树的根节点 root
以及树中两个不同节点的值 x
和 y
只有与值 x
和 y
对应的节点是 堂兄弟
节点时
才返回 true
,否则,返回 false
0x01 思路
两个节点的深度要相同,但是父节点不相同
题目给出的二叉树是:具有 唯一
值的
所以,可以先遍历整棵树
把每个节点的 父
节点及 高度
保存
再通过节点 x
和 y
的值
取出对应的 父
节点及 高度
进行比较即可
时间复杂度:O(N)
要遍历到每个节点
空间复杂度:O(N)
要存储每个节点对应的值与高度
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func isCousins(_ root: TreeNode?, _ x: Int, _ y: Int) -> Bool {
guard let root = root else { return false }
var dic1: [Int: Int] = [:] // 存储对应的深度
var dic2: [Int: TreeNode] = [:] // 存储对应的父节点
dic1[root.val] = 0
func dfs(_ root: TreeNode?, _ pre: TreeNode) {
guard let r = root else { return }
// 高度
dic1[r.val] = dic1[pre.val]! + 1
// 父节点
dic2[r.val] = pre
dfs(r.left, r)
dfs(r.right, r)
}
dfs(root.left, root)
dfs(root.right, root)
return (dic1[x] == dic1[y]) && (dic2[x] !== dic2[y])
}
小程序
学习五笔好帮手~