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])
}