题目:
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
算法:
方法一:bfs
注意判断两个节点是否有相同父节点的方法,不能用index差距为1来判断
func isCousins(root *TreeNode, x int, y int) bool {
arr := make([]*TreeNode, 0)
arr = append(arr, root)
xIndex, yIndex := -1, -1
pos := 0
for len(arr) != 0 {
n := len(arr)
for i := 0; i < n; i++ {
if arr[i] != nil {
if arr[i].Val == x {
xIndex = i
}
if arr[i].Val == y {
yIndex = i
}
arr = append(arr, arr[i].Left)
arr = append(arr, arr[i].Right)
}
}
if xIndex >= 0 && yIndex >= 0 {
// 同父节点意味着他们的index差距等于1
// [10,1,2,3,4,5,6]
// 4
// 5
return getFather(pos + xIndex) != getFather(pos + yIndex)
}
if xIndex >= 0 || yIndex >= 0 {
return false
}
arr = arr[n:]
pos = pos + n
}
return false
}
func abs(a, b int) int {
if a > b {
return a - b
}
return b - a
}
func getFather(index int) int {
if index == 0 {
return 0
}
return (index - 1) / 2
}